Merge remote-tracking branch 'origin/main' into main

This commit is contained in:
Hosted Weblate 2021-05-27 06:52:36 +02:00
commit 292f3b5d12
92 changed files with 6230 additions and 2103 deletions

View file

@ -6,7 +6,7 @@
<a href="https://www.gnu.org/licenses/gpl-3.0" alt="License: GPLv3"><img src="https://img.shields.io/badge/license-GPL%20v3-blue"></a> <a href="https://github.com/vishnuraghavb/EnRecipes/releases" alt="Release version"><img src="https://img.shields.io/github/v/release/vishnuraghavb/EnRecipes?color=ff5200"/></a> <a href="https://hosted.weblate.org/engage/enrecipes/">
<img src="https://hosted.weblate.org/widgets/enrecipes/-/app-translations/svg-badge.svg" alt="Translation status" /></a>
<p align="center">
<a href="https://play.google.com/store/apps/details?id=com.vishnuraghav.enrecipes"><img src="assets/Images/google-play-badge.png" height="80"/></a><a href="https://apt.izzysoft.de/fdroid/index/apk/com.vishnuraghav.enrecipes"><img src="assets/Images/IzzyOnDroid.png" height="80"/></a><br>You can also get the <a href="https://github.com/vishnuraghavb/EnRecipes/releases/latest">latest release on GitHub</a>
<a href="https://play.google.com/store/apps/details?id=com.vishnuraghav.EnRecipes"><img src="assets/Images/google-play-badge.png" height="80"/></a><a href="https://apt.izzysoft.de/fdroid/index/apk/com.vishnuraghav.EnRecipes"><img src="assets/Images/IzzyOnDroid.png" height="80"/></a><br>You can also get the <a href="https://github.com/vishnuraghavb/EnRecipes/releases/latest">latest release on GitHub</a>
</p>
<h2 align="center">Enjoying EnRecipes?</h2>
<p align="center">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.

39
app/ForegroundService.js Normal file
View file

@ -0,0 +1,39 @@
import { TimerNotif } from './shared/utils'
const superProto = android.app.Service.prototype
android.app.Service.extend('com.tns.ForegroundService', {
onStartCommand: function(intent, flags, startId) {
console.log('onStartCommand')
superProto.onStartCommand.call(this, intent, flags, startId)
return android.app.Service.START_STICKY
},
onCreate: function() {
console.log('onCreate')
superProto.onCreate.call(this)
this.startForeground(777, this.getNotification())
},
onBind: function(intent) {
return superProto.onBind.call(this, intent)
},
onUnbind: function(intent) {
return superProto.onUnbind.call(this, intent)
},
onDestroy: function() {
console.log('onDestroy')
this.stopForeground(true)
},
getNotification: function() {
return TimerNotif.getNotification(
{
bID: 'bringToFront',
cID: 'cti',
cName: 'Cooking Timer info',
description: `0 ongoing, 0 paused`,
nID: 777,
priority: -2,
sound: null,
title: 'EnRecipes is running',
},
this.getApplicationContext()
)
},
})

View file

@ -12,11 +12,11 @@ $gray10: #000000;
$orange: #ff5200;
Page {
font-family: "Inter-Medium";
font-family: 'Inter-Medium';
font-size: 14;
}
.ico {
font-family: "enrecipes";
font-family: 'enrecipes';
font-size: 24;
vertical-alignment: center;
&.sm {
@ -25,7 +25,7 @@ Page {
}
}
.tb {
font-family: "Inter-Bold";
font-family: 'Inter-Bold';
}
.tac {
text-align: center;
@ -180,7 +180,7 @@ TextView {
.progressContainer {
width: 100%;
}
Progress {
progress {
margin: 16;
background-color: $gray5;
}
@ -203,7 +203,7 @@ Switch {
@extend .hl;
}
}
Button {
button {
background-color: transparent;
z-index: 0;
padding: 8;
@ -240,7 +240,7 @@ Button {
width: 32;
height: 32;
min-width: 0;
margin: 0 0 0 8;
margin: 0 0 0 4;
vertical-alignment: center;
}
&.rate {
@ -253,7 +253,7 @@ Button {
// HOME
.emptyState {
padding: 16 16 8;
Label {
label {
@extend .tw;
}
.title {
@ -312,6 +312,25 @@ Button {
border-radius: 12;
}
// -----------------------------
// COOKING TIMER
.singleTimer {
padding: 8 16;
.info {
margin: 8;
}
.recipeTitle {
horizontal-alignment: left;
// font-size: 12;
}
progress {
color: $orange;
width: 100%;
height: 4;
margin: 8 0 0;
}
}
// -----------------------------
// SETTINGS
.group-info {
padding: 16 16 16 72;
@ -334,10 +353,10 @@ Button {
font-size: 12;
}
}
}
.listSpace {
height: 72;
}
}
// -----------------------------
// ABOUT
@ -376,10 +395,10 @@ Button {
@extend .tb;
@extend .tw;
}
}
.clickable {
color: $orange;
}
}
.ingredient {
padding: 0 16;
.value {
@ -452,7 +471,7 @@ Button {
horizontal-alignment: left;
.tool {
padding: 0 12;
Label {
label {
vertical-alignment: center;
}
.ico {
@ -509,7 +528,7 @@ Button {
color: $orange;
}
.activeDay {
background-color: rgba($orange, 0.2);
@extend .hl;
}
}
.dayPlan {
@ -549,7 +568,8 @@ Button {
}
ListPicker {
width: 25%;
height: 160;
height: 128;
margin: 16 0;
}
.listItem {
@extend .tw;
@ -596,19 +616,34 @@ ActivityIndicator {
}
// -----------------------------
// Transitions
.blink {
animation-name: blink;
animation-duration: 1s;
animation-iteration-count: infinite;
animation-timing-function: ease;
}
@keyframes blink {
0% {
opacity: 0;
}
50% {
opacity: 1;
}
100% {
opacity: 0;
}
}
.hl {
animation-name: hl;
animation-duration: 0.2s;
animation-fill-mode: forwards;
animation-timing-function: ease-out;
animation-timing-function: ease;
}
@keyframes hl {
0% {
opacity: 0.5;
background-color: transparent;
}
100% {
opacity: 1;
background-color: rgba($orange, 0.2);
}
}
@ -616,7 +651,7 @@ ActivityIndicator {
animation-name: fade;
animation-duration: 0.2s;
animation-fill-mode: forwards;
animation-timing-function: ease-out;
animation-timing-function: ease;
}
@keyframes fade {
0% {

View file

@ -0,0 +1,393 @@
<template>
<Page @loaded="onPageLoad" actionBarHidden="true">
<GridLayout rows="*, auto" columns="*">
<ScrollView
@scroll="onScroll($event)"
rowSpan="2"
scrollBarIndicatorVisible="false"
>
<StackLayout>
<GridLayout rows="auto" columns="*, auto, 8">
<Label class="pageTitle" :text="'timer' | L" />
<Button
col="1"
class="ico"
:text="icon.cog"
@tap="$navigateTo(CTSettings)"
/>
</GridLayout>
<Timer
v-for="(timer, i) in activeTimers"
:key="timer.id"
:timer="timer"
:timerIndex="i"
:formattedTime="formattedTime"
:removeTimer="removeTimer"
:addToPreset="addToPreset"
:togglePause="togglePause"
:fireTimer="fireTimer"
/>
<StackLayout class="listSpace"> </StackLayout>
</StackLayout>
</ScrollView>
<GridLayout
row="1"
@loaded="onAppBarLoad"
class="appbar"
:hidden="showUndo"
columns="auto, *, auto"
>
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
<Button class="ico fab" :text="icon.plus" @tap="addTimer" col="2" />
</GridLayout>
<SnackBar
:hidden="!showUndo || toast"
:count="countdown"
:msg="snackMsg"
:undo="undoDel"
:action="hideBar"
/>
<Toast :toast="toast" :action="hideBar" />
</GridLayout>
</Page>
</template>
<script lang="ts">
import { localize } from "@nativescript/localize";
import {
Observable,
CoreTypes,
Application,
ApplicationSettings,
AndroidApplication,
Utils,
Device,
} from "@nativescript/core";
import { mapState, mapActions } from "vuex";
import Action from "./modals/Action.vue";
import CTSettings from "./settings/CTSettings.vue";
import TimePickerHMS from "./modals/TimePickerHMS.vue";
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;
export default {
components: { Timer, Toast, SnackBar },
props: ["recipeID"],
data() {
return {
scrollPos: 1,
appbar: null,
countdown: 5,
snackMsg: null,
showUndo: false,
undo: false,
CTSettings: CTSettings,
toast: null,
};
},
computed: {
...mapState([
"icon",
"recipes",
"currentComponent",
"timerSound",
"timerVibrate",
"timerDelay",
"timerPresets",
"activeTimers",
]),
},
methods: {
...mapActions([
"setComponent",
"addActiveTimer",
"removeActiveTimer",
"clearTimerInterval",
"addTimerPreset",
"updateActiveTimer",
]),
onPageLoad({ object }) {
object.bindingContext = new Observable();
this.setComponent("CookingTimer");
},
onAppBarLoad({ object }) {
this.appbar = object;
},
onScroll(args) {
let scrollUp;
let y = args.scrollY;
if (y) {
scrollUp = y < this.scrollPos;
this.scrollPos = Math.abs(y);
let ab = this.appbar.translateY;
if (!scrollUp && ab == 0) {
this.appbar.animate({
translate: { x: 0, y: 64 },
duration: 250,
curve: CoreTypes.AnimationCurve.ease,
});
} else if (scrollUp && ab == 64) {
this.appbar.animate({
translate: { x: 0, y: 0 },
duration: 250,
curve: CoreTypes.AnimationCurve.ease,
});
}
}
},
// HELPERS
getRecipeTitle(id) {
let recipe = this.recipes.filter((e) => e.id === id)[0];
return recipe ? recipe.title : `[ ${localize("resNF")} ]`;
},
formattedTime(time) {
let hr = localize("hr");
let min = localize("min");
let sec = localize("sec");
let t = time.split(":");
let h = parseInt(t[0]);
let m = parseInt(t[1]);
let s = parseInt(t[2]);
let hasHrs = h ? `${h} ${hr}` : "";
let hasMins = m ? `${h ? " " : ""}${m} ${min}` : "";
let hasSecs = s ? `${h || m ? " " : ""}${s} ${sec}` : "";
return hasHrs + hasMins + hasSecs;
},
// NOTIFICATION HANDLERS
notifyTimers() {
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);
},
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;
utils.TimerNotif.show({
actions: true,
bID,
cID: "cta",
cName: "Cooking Timer alerts",
description: time,
nID: timer.id,
priority: 1,
sound: this.timerSound.uri,
title: title + description,
vibrate: this.timerVibrate,
});
Application.android.registerBroadcastReceiver(bID, (ctx, intent) => {
let action = intent.getStringExtra("action");
console.log(action, "firing");
EventBus.$emit(bID, action);
});
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) {
const ctx = Utils.ad.getApplicationContext();
const intent = new android.content.Intent(
ctx,
com.tns.ForegroundService.class
);
if (bool)
parseInt(Device.sdkVersion) < 26
? ctx.startService(intent)
: ctx.startForegroundService(intent);
else ctx.stopService(intent);
},
// DATA HANDLERS
addTimer() {
this.foregroundService(true);
this.$showModal(TimePickerHMS, {
props: {
title: "ntmr",
label: `${localize("tmr", this.activeTimers.length + 1)}`,
action: "strtBtn",
showPreset: this.timerPresets.length,
},
}).then((res) => {
if (res) {
if (res == "presets") {
let list = this.timerPresets.map(
(e) => `${e.label} - ${this.formattedTime(e.time)}`
);
this.$showModal(Action, {
props: {
title: "tmrPrsts",
list,
},
}).then((preset) => {
if (preset) {
let timer = JSON.parse(
JSON.stringify(this.timerPresets[list.indexOf(preset)])
);
timer.id = this.getRandomID();
this.addActiveTimer({
timer,
index: this.activeTimers.length,
});
this.notifyTimers();
}
});
} 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();
}
}
}
});
},
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`);
});
}
this.notifyTimers();
},
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;
this.updateActiveTimer(timer);
this.notifyTimers();
},
showToast(data) {
this.toast = localize(data);
utils.timer(5, (val) => {
if (!val) this.toast = val;
});
},
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);
});
},
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;
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);
});
},
undoDel() {
this.undo = true;
},
// HELPERS
getRandomID() {
return Math.floor(Math.random() * 9000000000) + 1000000000;
},
},
created() {
this.clearTimerInterval();
},
};
</script>

View file

@ -10,8 +10,8 @@
<Label class="pageTitle" padding="16 0" :text="`${title}` | L" />
<Image
margin="8 0 32"
v-if="recipe.imageSrc"
:src="recipe.imageSrc"
v-if="recipe.image"
:src="recipe.image"
stretch="aspectFit"
class="imgHolder"
:width="screenWidth - 32"
@ -95,7 +95,7 @@
<Label class="fieldLabel" :text="'yieldQ' | L" />
<TextField
ref="yieldQuantity"
v-model="recipe.yield.quantity"
v-model="recipe.yieldQuantity"
hint="1"
keyboardType="number"
returnKeyType="next"
@ -104,7 +104,7 @@
<StackLayout class="inputField" col="2">
<Label class="fieldLabel" :text="'yieldU' | L" />
<TextField
:text="`${recipe.yield.unit}` | L"
:text="`${recipe.yieldUnit}` | L"
editable="false"
@focus="!modalOpen && showYieldUnits(true)"
@tap="showYieldUnits(false)"
@ -252,23 +252,41 @@
<GridLayout
row="1"
@loaded="onAppBarLoad"
:colSpan="hasChanges || showUndo ? '2' : '1'"
:hidden="showUndo"
class="appbar"
:class="{ snackBar: showUndo }"
:colSpan="hasChanges ? 2 : 1"
columns="auto, *, auto"
>
<Button v-if="showUndo" :text="countdown" class="countdown ico tb" />
<Button v-else class="ico" :text="icon.back" @tap="navigateBack" />
<Label class="title" col="1" :hidden="!showUndo" :text="snackMsg | L" />
<Button class="ico" :text="icon.back" @tap="navigateBack" />
<Button
v-if="(hasChanges && !saving) || showUndo"
v-if="hasChanges && !saving"
class="ico fab"
:text="showUndo ? icon.undo : icon.save"
:text="icon.save"
col="2"
@tap="showUndo ? undoDel() : saveOperation()"
@tap="saveOperation()"
/>
<ActivityIndicator col="2" v-if="saving" :busy="saving" />
</GridLayout>
<SnackBar
:hidden="!showUndo"
colSpan="2"
:count="countdown"
:msg="snackMsg"
:undo="undoDel"
:action="hideUndoBar"
/>
<!-- <GridLayout
row="1"
class="appbar snackBar"
:hidden="!showUndo"
colSpan="2"
columns="auto, *, auto"
@swipe="hideUndoBar"
>
<Button :text="countdown" class="ico countdown tb" />
<Label class="title" col="1" :text="snackMsg | L" />
<Button class="ico fab" :text="icon.undo" @tap="undoDel" col="3" />
</GridLayout> -->
</GridLayout>
</Page>
</template>
@ -276,7 +294,6 @@
<script>
import {
AndroidApplication,
Application,
ApplicationSettings,
File,
getFileAccess,
@ -291,14 +308,18 @@ import {
import { localize } from "@nativescript/localize";
import { ImageCropper } from "nativescript-imagecropper";
import { mapState, mapActions } from "vuex";
import ActionDialog from "./modal/ActionDialog.vue";
import ActionDialogWithSearch from "./modal/ActionDialogWithSearch.vue";
import ConfirmDialog from "./modal/ConfirmDialog.vue";
import PromptDialog from "./modal/PromptDialog.vue";
import ListPicker from "./modal/ListPicker.vue";
import Action from "./modals/Action";
import ActionWithSearch from "./modals/ActionWithSearch";
import Confirm from "./modals/Confirm";
import Prompt from "./modals/Prompt";
import TimePickerHM from "./modals/TimePickerHM";
import * as utils from "~/shared/utils";
import SnackBar from "./sub/SnackBar";
let undoTimer;
export default {
components: {
SnackBar,
},
props: [
"recipeID",
"filterFavourites",
@ -309,34 +330,32 @@ export default {
return {
title: "newRec",
recipe: {
imageSrc: null,
title: undefined,
id: this.recipeID ? this.recipeID : this.getRandomID(),
image: null,
title: null,
cuisine: "Undefined",
category: "Undefined",
tags: [],
prepTime: "00:00",
cookTime: "00:00",
yield: {
quantity: undefined,
unit: "Serving",
},
yieldQuantity: null,
yieldUnit: "Serving",
difficulty: "Easy",
rating: 0,
ingredients: [],
instructions: [],
combinations: [],
notes: [],
isFavorite: false,
tried: true,
favorite: 0,
tried: 1,
lastTried: null,
lastModified: null,
created: null,
inBag: false,
},
tempRecipe: {},
tags: undefined,
modalOpen: false,
newRecipeID: null,
// newRecipeID: null,
saving: false,
cacheImagePath: null,
unSyncCombinations: [],
@ -374,13 +393,11 @@ export default {
...mapActions([
"setComponent",
"addRecipeAction",
"overwriteRecipeAction",
"addListItemAction",
"unSyncCombinationsAction",
]),
onPageLoad(args) {
const page = args.object;
page.bindingContext = new Observable();
onPageLoad({ object }) {
object.bindingContext = new Observable();
this.hijackBackEvent();
},
onPageUnload() {
@ -416,9 +433,9 @@ export default {
// PHOTO HANDLERS
imageHandler() {
this.clearEmptyFields(true);
if (this.recipe.imageSrc) {
if (this.recipe.image) {
this.modalOpen = true;
this.$showModal(ActionDialog, {
this.$showModal(Action, {
props: {
title: "recPic",
list: ["aap", "rp"],
@ -430,7 +447,7 @@ export default {
this.imagePicker();
break;
case "rp":
this.recipe.imageSrc = null;
this.recipe.image = null;
break;
}
});
@ -470,7 +487,7 @@ export default {
)
.then((cropped) => {
cropped.image.saveToFile(this.cacheImagePath, "jpg", 75);
this.recipe.imageSrc = this.cacheImagePath;
this.recipe.image = this.cacheImagePath;
});
});
}
@ -482,7 +499,7 @@ export default {
// DATA LIST
showCuisine(focus) {
this.modalOpen = true;
this.$showModal(ActionDialog, {
this.$showModal(Action, {
props: {
title: "cui",
list: this.cuisines,
@ -490,7 +507,7 @@ export default {
},
}).then((action) => {
if (action == "aNBtn") {
this.$showModal(PromptDialog, {
this.$showModal(Prompt, {
props: {
title: "newCui",
action: "aBtn",
@ -520,7 +537,7 @@ export default {
},
showCategories(focus) {
this.modalOpen = true;
this.$showModal(ActionDialog, {
this.$showModal(Action, {
props: {
title: "cat",
list: this.categories,
@ -528,7 +545,7 @@ export default {
},
}).then((action) => {
if (action == "aNBtn") {
this.$showModal(PromptDialog, {
this.$showModal(Prompt, {
props: {
title: "nwCat",
action: "aBtn",
@ -558,7 +575,7 @@ export default {
},
showYieldUnits(focus) {
this.modalOpen = true;
this.$showModal(ActionDialog, {
this.$showModal(Action, {
props: {
title: "yieldU",
list: this.yieldUnits,
@ -566,7 +583,7 @@ export default {
},
}).then((action) => {
if (action == "aNBtn") {
this.$showModal(PromptDialog, {
this.$showModal(Prompt, {
props: {
title: "nwYiU",
action: "aBtn",
@ -574,7 +591,7 @@ export default {
}).then((item) => {
this.modalOpen = false;
if (item.length) {
this.recipe.yield.unit = item;
this.recipe.yieldUnit = item;
this.addListItemAction({
item,
listName: "yieldUnits",
@ -585,18 +602,18 @@ export default {
} else {
this.modalOpen = false;
if (action) {
this.recipe.yield.unit = action;
this.recipe.yieldUnit = action;
if (focus) this.autoFocusField("difficultyLevel", false);
} else
this.yieldUnits.includes(this.recipe.yield.unit)
this.yieldUnits.includes(this.recipe.yieldUnit)
? mull
: (this.recipe.yield.unit = "Serving");
: (this.recipe.yieldUnit = "Serving");
}
});
},
showDifficultyLevel(focus) {
this.modalOpen = true;
this.$showModal(ActionDialog, {
this.$showModal(Action, {
props: {
title: "Difficulty level",
list: this.difficultyLevels,
@ -614,7 +631,7 @@ export default {
},
showUnits(e, focus, index) {
this.modalOpen = true;
this.$showModal(ActionDialog, {
this.$showModal(Action, {
props: {
title: "Unit",
list: this.units,
@ -622,7 +639,7 @@ export default {
},
}).then((action) => {
if (action == "aNBtn") {
this.$showModal(PromptDialog, {
this.$showModal(Prompt, {
props: {
title: "newUnit",
action: "aBtn",
@ -656,7 +673,7 @@ export default {
let filteredRecipes = this.recipes.filter(
(e) => !existingCombinations.includes(e.id)
);
this.$showModal(ActionDialogWithSearch, {
this.$showModal(ActionWithSearch, {
props: {
title: "selRec",
recipes: filteredRecipes,
@ -731,7 +748,7 @@ export default {
// SAVE OPERATION
clearEmptyFields(bool) {
if (!this.recipe.title && !bool) this.recipe.title = localize("untRec");
if (!this.recipe.yield.quantity) this.recipe.yield.quantity = 1;
if (!this.recipe.yieldQuantity) this.recipe.yieldQuantity = 1;
this.recipe.ingredients = this.recipe.ingredients.filter((e) => e.item);
let vm = this;
@ -744,13 +761,10 @@ export default {
saveOperation() {
this.saving = this.modalOpen = true;
this.clearEmptyFields();
this.recipe.lastModified = new Date();
this.recipe.lastModified = new Date().getTime();
ApplicationSettings.setString("previousCuisine", this.recipe.cuisine);
ApplicationSettings.setString("previousCategory", this.recipe.category);
ApplicationSettings.setString(
"previousYieldUnit",
this.recipe.yield.unit
);
ApplicationSettings.setString("previousYieldUnit", this.recipe.yieldUnit);
if (this.cacheImagePath) {
let recipeImage = path.join(
knownFolders.documents().getFolder("EnRecipes").getFolder("Images")
@ -759,18 +773,18 @@ export default {
);
let binarySource = File.fromPath(this.cacheImagePath).readSync();
File.fromPath(recipeImage).writeSync(binarySource);
this.recipe.imageSrc = recipeImage;
this.recipe.image = recipeImage;
knownFolders.temp().clear();
}
if (this.recipe.imageSrc) {
if (this.recipe.image) {
if (
this.tempRecipe.imageSrc &&
this.tempRecipe.imageSrc !== this.recipe.imageSrc
this.tempRecipe.image &&
this.tempRecipe.image !== this.recipe.image
) {
getFileAccess().deleteFile(this.tempRecipe.imageSrc);
getFileAccess().deleteFile(this.tempRecipe.image);
}
} else if (this.tempRecipe.imageSrc) {
getFileAccess().deleteFile(this.tempRecipe.imageSrc);
} else if (this.tempRecipe.image) {
getFileAccess().deleteFile(this.tempRecipe.image);
}
this.unSyncCombinationsAction({
id: this.recipeID,
@ -779,18 +793,7 @@ export default {
this.saveRecipe();
},
saveRecipe() {
if (this.recipeID) {
this.overwriteRecipeAction({
id: this.recipeID,
recipe: this.recipe,
});
} else {
this.recipe.id = this.newRecipeID;
this.addRecipeAction({
id: this.newRecipeID,
recipe: this.recipe,
});
}
this.addRecipeAction(this.recipe);
setTimeout(() => (this.saving = false), 100);
this.$navigateBack();
},
@ -819,6 +822,27 @@ export default {
}, 100);
});
},
hideUndoBar({ 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;
clearTimeout(undoTimer);
});
},
undoDel() {
this.undo = true;
},
@ -910,7 +934,7 @@ export default {
let t = this.recipe[time].split(":");
let hr = t[0];
let min = t[1];
this.$showModal(ListPicker, {
this.$showModal(TimePickerHM, {
props: {
title: `${time == "prepTime" ? "prepT" : "cookT"}`,
action: "SET",
@ -962,7 +986,7 @@ export default {
navigateBack() {
if (this.hasChanges) {
this.modalOpen = true;
this.$showModal(ConfirmDialog, {
this.$showModal(Confirm, {
props: {
title: "unsaved",
description: localize("disc"),
@ -1001,15 +1025,15 @@ export default {
this.tags = this.selectedTag;
this.splitTags();
}
this.recipe.yield.unit = ApplicationSettings.getString(
this.recipe.yieldUnit = ApplicationSettings.getString(
"previousYieldUnit",
"Serving"
);
if (this.filterFavourites) this.recipe.isFavorite = true;
if (this.filterFavourites) this.recipe.favorite = true;
if (this.filterTrylater) this.recipe.tried = false;
this.recipe.created = new Date();
this.recipe.created = new Date().getTime();
Object.assign(this.tempRecipe, JSON.parse(JSON.stringify(this.recipe)));
this.newRecipeID = this.getRandomID();
// this.newRecipeID = this.getRandomID();
}
},
};

View file

@ -12,13 +12,13 @@
@scroll="!selectMode && onScroll($event)"
>
<v-template name="header">
<GridLayout rows="auto" columns="*, auto, 12">
<GridLayout rows="auto" columns="*, auto, 8">
<Label class="pageTitle" :text="`${currentComponent}` | L" />
<Button
col="1"
class="ico"
:text="icon.cog"
@tap="navigateTo(Settings, 'Settings', true)"
@tap="navigateTo(AppSettings, 'Settings', true)"
/>
</GridLayout>
</v-template>
@ -78,8 +78,8 @@
<Image
class="imgHolder"
verticalAlignment="center"
v-if="recipe.imageSrc"
:src="recipe.imageSrc"
v-if="recipe.image"
:src="recipe.image"
stretch="none"
decodeWidth="96"
decodeHeight="96"
@ -143,8 +143,8 @@
>
<Image
class="imgHolder"
v-if="recipe.imageSrc"
:src="recipe.imageSrc"
v-if="recipe.image"
:src="recipe.image"
stretch="aspectFit"
:decodeWidth="imgWidth"
:decodeHeight="imgWidth"
@ -198,8 +198,8 @@
>
<Image
class="imgHolder"
v-if="recipe.imageSrc"
:src="recipe.imageSrc"
v-if="recipe.image"
:src="recipe.image"
stretch="aspectFit"
:decodeWidth="imgWidth"
:decodeHeight="imgWidth"
@ -311,11 +311,20 @@
</GridLayout>
<GridLayout
row="1"
rows="auto"
rows="auto, auto"
columns="auto"
class="appbar toolbar"
:hidden="!showTools"
>
<GridLayout
rows="48"
class="tool"
columns="auto, *"
@touch="touchTool($event, CookingTimer, 'CookingTimer')"
>
<Label class="ico" :text="icon.timer" />
<Label col="1" :text="'timer' | L" />
</GridLayout>
<GridLayout
row="1"
rows="48"
@ -416,15 +425,17 @@ import {
startAccelerometerUpdates,
stopAccelerometerUpdates,
} from "@triniwiz/nativescript-accelerometer";
import { mapActions, mapState } from "vuex";
import ViewRecipe from "./ViewRecipe";
import EditRecipe from "./EditRecipe";
import MealPlanner from "./MealPlanner";
import CookingTimer from "./CookingTimer";
import GroceryList from "./GroceryList";
import Settings from "./Settings";
import ActionDialog from "./modal/ActionDialog.vue";
import ConfirmDialog from "./modal/ConfirmDialog.vue";
import Filters from "./modal/Filters.vue";
import AppSettings from "./settings/AppSettings";
import Action from "./modals/Action";
import Confirm from "./modals/Confirm";
import Filters from "./modals/Filter";
import * as utils from "~/shared/utils";
let lastTime = 0;
let lastShake = 0;
@ -445,9 +456,10 @@ export default {
scrollPos: 1,
filterFavourites: false,
filterTrylater: false,
AppSettings: AppSettings,
MealPlanner: MealPlanner,
CookingTimer: CookingTimer,
GroceryList: GroceryList,
Settings: Settings,
topmenu: [
{
title: "EnRecipes",
@ -465,13 +477,6 @@ export default {
showTools: false,
};
},
components: {
ViewRecipe,
EditRecipe,
MealPlanner,
GroceryList,
Settings,
},
computed: {
...mapState([
"icon",
@ -488,6 +493,7 @@ export default {
"selectedCategory",
"selectedTag",
"appTheme",
"timerSound",
]),
filteredRecipes() {
let vm = this;
@ -501,7 +507,7 @@ export default {
return this.recipes
.filter(
(e) =>
e.isFavorite &&
e.favorite &&
(e.title.toLowerCase().includes(this.searchQuery) ||
getIngredients(e))
)
@ -557,16 +563,16 @@ export default {
"setFirstDay",
"setLayout",
"setSortType",
"deleteRecipeAction",
"deleteRecipesAction",
"deleteRecipes",
"clearFilter",
"setTheme",
"setTimerSound",
]),
onFrameLoad() {
const View = android.view.View;
const window = Application.android.startActivity.getWindow();
const decorView = window.getDecorView();
let sdkv = Device.sdkVersion;
let sdkv = Device.sdkVersion * 1;
function setColors(color) {
window.setStatusBarColor(new Color(color).android);
sdkv >= 27 && window.setNavigationBarColor(new Color(color).android);
@ -597,9 +603,8 @@ export default {
: View.SYSTEM_UI_FLAG_DARK_STATUS_BAR
);
},
onPageLoad(args) {
const page = args.object;
page.bindingContext = new Observable();
onPageLoad({ object }) {
object.bindingContext = new Observable();
this.filterFavourites
? this.setComponent("favourites")
: this.filterTrylater
@ -679,7 +684,7 @@ export default {
openSort() {
this.showTools = false;
this.releaseBackEvent();
this.$showModal(ActionDialog, {
this.$showModal(Action, {
props: {
title: "srt",
list: [
@ -694,7 +699,7 @@ export default {
],
},
}).then((action) => {
if (action && action !== "Cancel" && this.sortType !== action) {
if (action && this.sortType !== action) {
this.setSortType(action);
ApplicationSettings.setString("sortType", action);
this.updateSort();
@ -733,53 +738,35 @@ export default {
this.listview.refresh();
},
deleteSelection() {
this.selection.length === 1
? this.deleteRecipe(this.selection[0])
: this.deleteRecipes(this.selection);
this.deletionDialogActive = true;
let hasMany = this.selection.length > 1;
let what = hasMany
? `${this.selection.length} ${localize("recs")}`
: `"${
this.recipes[
this.recipes.findIndex((e) => e.id === this.selection[0])
].title
}"`;
this.$showModal(Confirm, {
props: {
title: localize("conf"),
description: `${localize(
hasMany ? "delRecsInfo" : "delRecInfo",
what
)}`,
cancelButtonText: "cBtn",
okButtonText: "dBtn",
},
}).then((action) => {
if (action) {
this.deleteRecipes(this.selection);
if (!this.filteredRecipes.length) this.goToHome();
this.clearSelection();
}
this.deletionDialogActive = false;
});
},
exportSelection() {},
deleteRecipe(id) {
this.deletionDialogActive = true;
let index = this.recipes.findIndex((e) => e.id === id);
let recipeTitle = `"${this.recipes[index].title}"`;
this.$showModal(ConfirmDialog, {
props: {
title: localize("conf"),
description: `${localize("delRecInfo", recipeTitle)}`,
cancelButtonText: "cBtn",
okButtonText: "dBtn",
},
}).then((action) => {
if (action) {
this.deleteRecipeAction({
index,
id,
});
if (!this.filteredRecipes.length) this.goToHome();
this.clearSelection();
}
this.deletionDialogActive = false;
});
},
deleteRecipes(idsArr) {
this.deletionDialogActive = true;
let selectionCount = `${this.selection.length} ${localize("recs")}`;
this.$showModal(ConfirmDialog, {
props: {
title: localize("conf"),
description: `${localize("delRecsInfo", selectionCount)}`,
cancelButtonText: "cBtn",
okButtonText: "dBtn",
},
}).then((action) => {
if (action) {
this.deleteRecipesAction(idsArr);
if (!this.filteredRecipes.length) this.goToHome();
this.clearSelection();
}
this.deletionDialogActive = false;
});
},
// SHAKE DETECTOR
onSensorData({ x, y, z }) {
@ -836,7 +823,7 @@ export default {
count = this.recipes.filter((e) => !e.tried).length;
break;
case "favourites":
count = this.recipes.filter((e) => e.isFavorite).length;
count = this.recipes.filter((e) => e.favorite).length;
break;
default:
count = this.recipes.filter((e) => {
@ -1089,12 +1076,15 @@ export default {
},
created() {
this.setTheme(ApplicationSettings.getString("appTheme", "sysDef"));
this.setLayout(ApplicationSettings.getString("layout", "detailed"));
if (!this.recipes.length) this.initRecipes();
this.initMealPlans();
this.initListItems();
if (!this.mealPlans.length) this.initMealPlans();
this.setShake(ApplicationSettings.getBoolean("shakeEnabled", true));
this.setFirstDay(ApplicationSettings.getBoolean("mondayFirst", false));
if (!this.timerSound.title) {
let hasTimerSound = ApplicationSettings.getString("timerSound", 0);
this.setTimerSound(
hasTimerSound ? JSON.parse(hasTimerSound) : utils.getTones().defaultTone
);
}
},
};
</script>

View file

@ -28,9 +28,8 @@ export default {
},
methods: {
...mapActions(["setComponent"]),
onPageLoad(args) {
const page = args.object;
page.bindingContext = new Observable();
onPageLoad({ object }) {
object.bindingContext = new Observable();
this.setComponent("GroceryList");
},
// HELPERS

View file

@ -7,7 +7,15 @@
scrollBarIndicatorVisible="false"
>
<StackLayout>
<GridLayout rows="auto" columns="*, auto, 8">
<Label class="pageTitle" :text="'planner' | L" />
<Button
col="1"
class="ico"
:text="icon.cog"
@tap="$navigateTo(MPSettings)"
/>
</GridLayout>
<GridLayout
class="calendar"
columns="*, *, *, *, *, *, *"
@ -112,31 +120,32 @@
col="3"
/>
</GridLayout>
<GridLayout
row="1"
class="appbar snackBar"
<SnackBar
:hidden="!showUndo"
columns="auto, *, auto"
>
<Button :text="countdown" class="ico countdown tb" />
<Label class="title" col="1" :text="snackMsg | L" />
<Button class="ico fab" :text="icon.undo" @tap="undoDel" col="3" />
</GridLayout>
:count="countdown"
:msg="snackMsg"
:undo="undoDel"
:action="hideUndoBar"
/>
</GridLayout>
</Page>
</template>
<script>
import { ApplicationSettings, Observable, CoreTypes } from "@nativescript/core";
import { Observable, CoreTypes } from "@nativescript/core";
import { mapState, mapActions } from "vuex";
import ViewRecipe from "./ViewRecipe.vue";
import ActionDialogWithSearch from "./modal/ActionDialogWithSearch.vue";
import ViewRecipe from "./ViewRecipe";
import MPSettings from "./settings/MPSettings";
import ActionWithSearch from "./modals/ActionWithSearch";
import SnackBar from "./sub/SnackBar";
let undoTimer;
export default {
components: {
SnackBar,
},
data() {
return {
appTheme: "Light",
mealTimes: ["breakfast", "lunch", "dinner", "snacks"],
dNames: ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"],
year: 2021,
@ -163,6 +172,7 @@ export default {
snackMsg: null,
showUndo: false,
undo: false,
MPSettings: MPSettings,
};
},
computed: {
@ -181,8 +191,9 @@ export default {
} else return 0;
},
getDayNames() {
if (!this.mondayFirst) this.dNames.unshift(this.dNames.pop());
return this.dNames;
let dNames = [...this.dNames];
if (!this.mondayFirst) dNames.unshift(dNames.pop());
return dNames;
},
getCal() {
let y = this.year;
@ -216,9 +227,8 @@ export default {
"addMealPlanAction",
"deleteMealPlanAction",
]),
onPageLoad(args) {
const page = args.object;
page.bindingContext = new Observable();
onPageLoad({ object }) {
object.bindingContext = new Observable();
this.setComponent("MealPlanner");
if (!this.today || this.today === new Date().getDate()) this.goToToday();
},
@ -316,12 +326,11 @@ export default {
setToday(date) {
if (date) this.today = date;
},
newMealPlan(title, date, type, index) {
newMealPlan(date, type, title) {
this.addMealPlanAction({
title,
date: date ? date : this.todaysTime,
type,
index,
title,
});
},
toggleEditMode() {
@ -332,30 +341,22 @@ export default {
let filteredRecipes = this.recipes.filter((e) =>
this.getRecipes[type] ? !this.getRecipes[type].includes(e.id) : true
);
this.$showModal(ActionDialogWithSearch, {
this.$showModal(ActionWithSearch, {
props: {
title: "selRec",
recipes: filteredRecipes,
},
}).then((title) => {
title && this.newMealPlan(title, null, type, null);
});
}).then((title) => title && this.newMealPlan(null, type, title));
},
removeRecipe(title, type) {
let date = this.todaysTime;
let index = this.mealPlans.findIndex(
(e) => e.title === title && e.type === type && e.date === date
);
let mealPlan = {
title,
date,
type,
index,
title,
};
this.deleteMealPlanAction(mealPlan);
this.showUndoBar("recRm").then((res) =>
this.newMealPlan(title, date, type, index)
);
this.showUndoBar("recRm").then(() => this.newMealPlan(date, type, title));
},
showUndoBar(message) {
return new Promise((resolve, reject) => {
@ -379,12 +380,30 @@ export default {
}, 100);
});
},
hideUndoBar({ 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;
clearTimeout(undoTimer);
});
},
undoDel() {
this.undo = true;
},
},
created() {
this.appTheme = ApplicationSettings.getString("appTheme", "Light");
},
};
</script>

View file

@ -1,106 +0,0 @@
<template>
<Page @loaded="onPageLoad" actionBarHidden="true">
<GridLayout rows="*, auto" columns="auto, *">
<ListView
colSpan="2"
rowSpan="2"
class="options-list"
for="item in items"
>
<v-template if="$index == 0">
<Label class="pageTitle" :text="'Settings' | L" />
</v-template>
<v-template if="$index == 6">
<StackLayout class="listSpace"> </StackLayout>
</v-template>
<v-template>
<GridLayout
columns="auto, *"
class="option"
@touch="touch($event, item.view)"
>
<Label
verticalAlignment="center"
class="ico"
:text="icon[item.icon]"
/>
<Label verticalAlignment="center" col="1" :text="item.title | L" />
</GridLayout>
</v-template>
</ListView>
<GridLayout row="1" class="appbar" rows="*" columns="auto, *">
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
</GridLayout>
</Page>
</template>
<script>
import { Observable } from "@nativescript/core";
import { mapState, mapActions } from "vuex";
import Interface from "./Settings/Interface.vue";
import Options from "./Settings/Options.vue";
import Database from "./Settings/Database.vue";
import Reset from "./Settings/Reset.vue";
import About from "./Settings/About.vue";
export default {
data() {
return {
items: [
{},
{
icon: "interface",
title: "intf",
view: Interface,
},
{
icon: "opts",
title: "opts",
view: Options,
},
{
icon: "db",
title: "db",
view: Database,
},
{
icon: "reset",
title: "rest",
view: Reset,
},
{
icon: "info",
title: "About",
view: About,
},
{},
],
};
},
computed: {
...mapState(["icon"]),
},
methods: {
...mapActions(["setComponent"]),
onPageLoad(args) {
const page = args.object;
page.bindingContext = new Observable();
this.setComponent("Settings");
},
// HELPERS
navigateTo(view) {
this.$navigateTo(view, {
transition: {
name: "slide",
duration: 200,
curve: "easeOut",
},
});
},
touch({ object, action }, view) {
object.className = action.match(/down|move/) ? "option fade" : "option";
if (action == "up") this.navigateTo(view);
},
},
};
</script>

View file

@ -1,139 +0,0 @@
<template>
<Page @loaded="onPageLoad" actionBarHidden="true">
<GridLayout rows="*, auto" columns="auto, *">
<ListView
colSpan="2"
rowSpan="2"
class="options-list"
for="item in items"
>
<v-template if="$index == 0">
<Label class="pageTitle" :text="'Settings' | L" />
</v-template>
<v-template if="item.type == 'switch'">
<GridLayout columns="auto, *, auto" class="option">
<Label class="ico" :text="icon[item.icon]" />
<StackLayout col="1" verticalAlignment="center">
<Label :text="item.title | L" class="info" />
<Label
v-if="item.subTitle"
:text="item.subTitle | L"
class="sub"
/>
</StackLayout>
<Switch
:color="item.checked ? '#ff5200' : '#adb5bd'"
col="2"
:checked="item.checked"
@checkedChange="item.action"
/>
</GridLayout>
</v-template>
<v-template if="item.type == 'list'">
<GridLayout
columns="auto, *"
class="option"
@touch="touch($event, item.action)"
>
<Label class="ico" :text="icon[item.icon]" />
<StackLayout col="1">
<Label :text="item.title | L" class="info" />
<Label :text="item.subTitle" class="sub" />
</StackLayout>
</GridLayout>
</v-template>
<v-template>
<StackLayout class="listSpace"> </StackLayout>
</v-template>
</ListView>
<GridLayout row="1" class="appbar" rows="*" columns="auto, *">
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
</GridLayout>
</Page>
</template>
<script>
import { Observable } from "@nativescript/core";
import { mapState, mapActions } from "vuex";
import { localize } from "@nativescript/localize";
import ActionDialog from "../modal/ActionDialog.vue";
import * as utils from "~/shared/utils";
export default {
computed: {
...mapState(["icon", "timerDelay", "timerSound", "timerVibrate"]),
items() {
return [
{},
{
type: "list",
icon: "delay",
title: "dlyDur",
subTitle: this.timerDelay,
action: this.showDelayList,
},
{
type: "list",
icon: "sound",
title: "tmrSnd",
subTitle: this.timerSound.title,
action: this.showSoundsList,
},
{
type: "switch",
icon: "vibrate",
title: "tmrvbrt",
checked: this.timerVibrate,
action: this.toggleTimerVibrate,
},
{},
];
},
},
methods: {
...mapActions(["setTimerDelay", "setTimerSound", "setTimerVibrate"]),
onPageLoad(args) {
const page = args.object;
page.bindingContext = new Observable();
},
toggleTimerVibrate({ object }) {
this.setTimerVibrate(object.checked);
},
showDelayList() {
let list = [
...Array.from(Array(4), (_, x) => x + 1),
...Array.from(Array(6), (_, x) => (x + 1) * 5),
].map(
(e, i) => `${e} ${i == 0 ? localize("minute") : localize("minutes")}`
);
this.$showModal(ActionDialog, {
props: {
title: "dlyDur",
list,
},
}).then((dur) => dur && this.setTimerDelay(dur));
},
showSoundsList() {
let tones = utils.getTones();
this.$showModal(ActionDialog, {
props: {
title: "tmrSnd",
list: tones.map((e) => e.title),
},
}).then(
(tone) =>
tone &&
tone !== this.timerSound.title &&
this.setTimerSound(tones.filter((e) => e.title === tone)[0])
);
},
// HELPERS
touch({ object, action }, method) {
object.className = action.match(/down|move/) ? "option fade" : "option";
if (action == "up") method();
},
},
};
</script>

View file

@ -1,119 +0,0 @@
<template>
<Page @loaded="onPageLoad" actionBarHidden="true">
<GridLayout rows="*, auto" columns="auto, *">
<ListView
colSpan="2"
rowSpan="2"
class="options-list"
for="item in items"
>
<v-template if="$index == 0">
<Label class="pageTitle" :text="'opts' | L" />
</v-template>
<v-template if="item.type == 'switch'">
<GridLayout columns="auto, *, auto" class="option">
<Label class="ico" :text="icon[item.icon]" />
<StackLayout col="1" verticalAlignment="center">
<Label :text="item.title | L" class="info" />
<Label
v-if="item.subTitle"
:text="item.subTitle | L"
class="sub"
/>
</StackLayout>
<Switch
:color="item.checked ? '#ff5200' : '#adb5bd'"
col="2"
:checked="item.checked"
@checkedChange="item.action"
/>
</GridLayout>
</v-template>
<v-template>
<StackLayout class="listSpace"> </StackLayout>
</v-template>
</ListView>
<GridLayout
v-show="!toast"
row="1"
class="appbar"
rows="*"
columns="auto, *"
>
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
<GridLayout
v-show="toast"
row="1"
colSpan="2"
class="appbar snackBar"
columns="*"
@tap="toast = null"
>
<FlexboxLayout minHeight="48" alignItems="center">
<Label class="title msg" :text="toast" />
</FlexboxLayout>
</GridLayout>
</GridLayout>
</Page>
</template>
<script>
import { Observable } from "@nativescript/core";
import { mapState, mapActions } from "vuex";
import { localize } from "@nativescript/localize";
import * as utils from "~/shared/utils";
export default {
data() {
return {
toast: null,
};
},
computed: {
...mapState(["icon", "shakeEnabled", "mondayFirst"]),
items() {
return [
{},
{
type: "switch",
icon: "shuf",
title: "sVw",
subTitle: "sVwInfo",
checked: this.shakeEnabled,
action: this.toggleShake,
},
{
type: "switch",
icon: "week",
title: "swm",
checked: this.mondayFirst,
action: this.toggleFirstDay,
},
{},
];
},
},
methods: {
...mapActions(["setShake", "setFirstDay"]),
onPageLoad(args) {
const page = args.object;
page.bindingContext = new Observable();
},
toggleFirstDay({ object }) {
this.setFirstDay(object.checked);
},
// SHAKE VIEW RANDOM RECIPE
toggleShake({ object }) {
let checked = object.checked;
if (checked && !utils.hasAccelerometer()) {
object.checked = false;
this.toast = localize("noAccSensor");
utils.timer(5, (val) => {
if (!val) this.toast = val;
});
} else this.setShake(checked);
},
},
};
</script>

View file

@ -1,112 +0,0 @@
<template>
<Page @loaded="onPageLoad" actionBarHidden="true">
<GridLayout rows="*, auto" columns="auto, *">
<ListView
colSpan="2"
rowSpan="2"
class="options-list"
for="item in items"
>
<v-template if="$index == 0">
<Label class="pageTitle" :text="'rest' | L" />
</v-template>
<v-template if="$index == 5">
<Label class="group-info sub tw" :text="'restInfo' | L" />
</v-template>
<v-template if="$index == 6">
<StackLayout class="listSpace"> </StackLayout>
</v-template>
<v-template>
<GridLayout
columns="auto, *"
class="option"
@touch="touch($event, item.type)"
>
<Label class="ico" :text="icon.reset" />
<Label col="1" :text="item.title | L" class="info" />
</GridLayout>
</v-template>
</ListView>
<GridLayout
v-show="!toast"
row="1"
class="appbar"
rows="*"
columns="auto, *"
>
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
<GridLayout
v-show="toast"
row="1"
colSpan="2"
class="appbar snackBar"
columns="*"
@tap="toast = null"
>
<FlexboxLayout minHeight="48" alignItems="center">
<Label class="title msg" :text="toast" />
</FlexboxLayout>
</GridLayout>
</GridLayout>
</Page>
</template>
<script>
import { Observable } from "@nativescript/core";
import { localize } from "@nativescript/localize";
import { mapState, mapActions } from "vuex";
import * as utils from "~/shared/utils";
export default {
data() {
return {
toast: null,
};
},
computed: {
...mapState(["icon"]),
items() {
return [
{},
{
type: "cuisines",
title: "restCuiL",
},
{
type: "categories",
title: "restCatL",
},
{
type: "yieldUnits",
title: "restYUL",
},
{
type: "units",
title: "restUL",
},
{},
{},
];
},
},
methods: {
...mapActions(["resetListItemsAction"]),
onPageLoad(args) {
const page = args.object;
page.bindingContext = new Observable();
},
// RESET
resetListItems(listName) {
this.resetListItemsAction(listName);
this.toast = localize("restDone");
utils.timer(5, (val) => {
if (!val) this.toast = val;
});
},
touch({ object, action }, type) {
object.className = action.match(/down|move/) ? "option fade" : "option";
if (action == "up") this.resetListItems(type);
},
},
};
</script>

View file

@ -26,8 +26,8 @@
</StackLayout>
<Image
col="1"
v-if="recipe.imageSrc"
:src="recipe.imageSrc"
v-if="recipe.image"
:src="recipe.image"
stretch="aspectFit"
class="photo"
decodeWidth="96"
@ -81,8 +81,9 @@
<Label
@touch="touchYield"
class="value clickable"
horizontalAlignment="left"
:text="`${tempYieldQuantity} ${$options.filters.L(
recipe.yield.unit
recipe.yieldUnit
)}`"
/>
</StackLayout>
@ -183,7 +184,7 @@
@loaded="onAppBarLoad"
class="appbar"
v-show="!toast"
columns="auto, *, auto, auto, auto, auto"
columns="auto, *, auto, auto, auto, auto, auto"
>
<Button
class="ico"
@ -192,57 +193,53 @@
/>
<Button
col="2"
class="ico"
:text="icon.timer"
@tap="openCookingTimer"
/>
<Button
col="3"
v-if="!filterTrylater"
class="ico"
:text="recipe.tried ? icon.try : icon.tried"
@tap="toggle('tried')"
/>
<Button
col="2"
col="3"
v-else
class="ico"
:text="icon.done"
@tap="recipeTried"
/>
<Button
col="3"
class="ico"
:text="recipe.isFavorite ? icon.faved : icon.fav"
@tap="toggle('isFavorite')"
@tap="toggle('tried', true)"
/>
<Button
col="4"
class="ico"
:text="recipe.favorite ? icon.faved : icon.fav"
@tap="toggle('favorite')"
/>
<Button
col="5"
v-if="!busy"
class="ico"
:text="icon.edit"
@tap="editRecipe"
/>
<ActivityIndicator col="4" v-else :busy="busy" />
<ActivityIndicator col="5" v-else :busy="busy" />
<Button
col="6"
class="ico fab"
:text="icon.share"
col="5"
@tap="shareHandler"
/>
</GridLayout>
<GridLayout
v-show="toast"
row="1"
class="appbar snackBar"
columns="*"
@tap="toast = null"
>
<FlexboxLayout minHeight="48" alignItems="center">
<Label class="title msg" :text="toast" />
</FlexboxLayout>
</GridLayout>
<Toast :toast="toast" :action="hideLastTried" />
<AbsoluteLayout rowSpan="2">
<Image
@tap="({ object }) => (object.cancel = true)"
backgroundColor="black"
stretch="aspectFit"
@loaded="onImgViewLoad"
:src="recipe.imageSrc"
:src="recipe.image"
class="photoviewer"
/>
</AbsoluteLayout>
@ -266,11 +263,14 @@ import {
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";
import ActionDialog from "./modal/ActionDialog.vue";
import PromptDialog from "./modal/PromptDialog.vue";
import Action from "./modals/Action.vue";
import Toast from "./sub/Toast.vue";
import Prompt from "./modals/Prompt.vue";
import * as utils from "~/shared/utils";
export default {
components: { Toast },
props: ["filterTrylater", "recipeID"],
data() {
return {
@ -325,18 +325,15 @@ export default {
...mapActions([
"toggleStateAction",
"setComponent",
"overwriteRecipeAction",
"setRecipeAsTriedAction",
"setRatingAction",
"toggleCartAction",
]),
onPageLoad(args) {
const page = args.object;
page.bindingContext = new Observable();
onPageLoad({ object }) {
object.bindingContext = new Observable();
this.busy = this.photoOpen = false;
this.setComponent("ViewRecipe");
if (this.yieldMultiplier == this.recipe.yield.quantity)
this.yieldMultiplier = this.recipe.yield.quantity;
if (this.yieldMultiplier == this.recipe.yieldQuantity)
this.yieldMultiplier = this.recipe.yieldQuantity;
this.keepScreenOn(true);
this.syncCombinations();
},
@ -374,7 +371,6 @@ export default {
onStickyLoad({ object }) {
this.sticky = object;
},
// FIX: scroll not smooth
fixTitle({ object }, swipeUp: boolean): void {
let ingL = this.recipe.ingredients.length;
let insL = this.recipe.instructions.length;
@ -394,17 +390,6 @@ export default {
{ length: 4 },
(v, i) => (v = arr[i] ? i < n : false)
);
// this.sticky
// .animate({
// opacity: 0.5,
// duration: 0,
// })
// .then(() => {
// this.sticky.animate({
// opacity: 1,
// duration: 250,
// });
// });
};
if (swipeUp) {
@ -467,9 +452,9 @@ export default {
return localize(title) + text;
},
changeYield() {
this.$showModal(PromptDialog, {
this.$showModal(Prompt, {
props: {
title: `${localize("req", localize(this.recipe.yield.unit))}`,
title: `${localize("req", localize(this.recipe.yieldUnit))}`,
placeholder: Math.abs(parseFloat(this.yieldMultiplier)),
action: "SET",
},
@ -480,8 +465,7 @@ export default {
hasTime(time) {
return time != "00:00";
},
niceDate(time) {
let lastTried = new Date(time).getTime();
niceDate(lastTried) {
let now = new Date().getTime();
let midnight = new Date().setHours(0, 0, 0, 0);
let diff = (now - lastTried) / 1000;
@ -506,19 +490,40 @@ export default {
if (!val) this.toast = val;
});
},
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;
});
},
// getMeasure(value: number, unit: string) {
// let vm = this;
// function roundedQ(val: number) {
// return Math.abs(
// Math.round(
// (val / vm.recipe.yield.quantity) * vm.tempYieldQuantity * 100
// (val / vm.recipe.yieldQuantity) * vm.tempYieldQuantity * 100
// ) / 100
// );
// }
// if (value) {
// let rounded = Math.abs(
// Math.round(
// (value / this.recipe.yield.quantity) * this.tempYieldQuantity * 100
// (value / this.recipe.yieldQuantity) * this.tempYieldQuantity * 100
// ) / 100
// );
// let lUnit = localize(unit);
@ -551,7 +556,7 @@ export default {
roundedQuantity(quantity: number) {
return Math.abs(
Math.round(
(quantity / this.recipe.yield.quantity) * this.tempYieldQuantity * 100
(quantity / this.recipe.yieldQuantity) * this.tempYieldQuantity * 100
) / 100
);
},
@ -598,10 +603,10 @@ export default {
)
.map((e) => e.id);
this.recipe.combinations = combinationForOtherRecipes;
this.overwriteRecipeAction({
id: this.currentRecipeID,
recipe: this.recipe,
});
// this.overwriteRecipeAction({
// id: this.currentRecipeID,
// recipe: this.recipe,
// });
},
touchIngredient({ object, action }, index) {
object.className = action.match(/down|move/)
@ -672,14 +677,14 @@ export default {
this.currentRecipeID = combination;
this.syncCombinations();
this.createNotes();
this.yieldMultiplier = this.recipe.yield.quantity;
this.yieldMultiplier = this.recipe.yieldQuantity;
this.recipe.tried && this.recipe.lastTried && this.showLastTried();
},
// SHARE ACTION
shareHandler() {
if (this.recipe.imageSrc) {
this.$showModal(ActionDialog, {
if (this.recipe.image) {
this.$showModal(Action, {
props: {
title: "shr",
list: ["rec", "pht"],
@ -690,7 +695,7 @@ export default {
this.shareRecipe();
break;
case "pht":
ImageSource.fromFile(this.recipe.imageSrc).then((res) =>
ImageSource.fromFile(this.recipe.image).then((res) =>
utils.shareImage(res, localize("srpu"))
);
break;
@ -718,7 +723,7 @@ export default {
this.recipe.cookTime
)}\n`;
overview += `${localize("yld")}: ${this.tempYieldQuantity} ${localize(
this.recipe.yield.unit
this.recipe.yieldUnit
)}\n${localize("Difficulty level")}: ${localize(
this.recipe.difficulty
)}\n`;
@ -765,26 +770,18 @@ export default {
},
// DATA HANDLERS
toggle(key, setDate) {
toggle(key: string, setDate: boolean) {
this.toggleStateAction({
id: this.currentRecipeID,
recipe: this.recipe,
key,
setDate,
});
},
recipeTried() {
this.setRecipeAsTriedAction({
id: this.currentRecipeID,
recipe: this.recipe,
});
this.$navigateBack();
if (setDate) this.$navigateBack();
},
setRating(rating) {
if (rating !== this.recipe.rating || rating === 1) {
this.setRatingAction({
id: this.currentRecipeID,
recipe: this.recipe,
rating,
});
}
@ -797,7 +794,6 @@ export default {
}
this.toggleCartAction({
id: this.currentRecipeID,
recipe: this.recipe,
});
},
@ -855,7 +851,6 @@ export default {
} else this.$navigateBack();
},
viewPhoto() {
// this.imgView.initNativeView();
this.photoOpen = true;
this.hijackBackEvent();
let pv = this.imgView;
@ -920,6 +915,14 @@ export default {
this.photoOpen ? this.closePhoto() : this.$navigateBack();
},
//TIMERS
openCookingTimer() {
this.$navigateTo(CookingTimer, {
props: {
recipeID: this.recipe.id,
},
});
},
//HELPERS
touchYield({ object, action }) {
object.className = action.match(/down|move/)
@ -933,7 +936,7 @@ export default {
this.recipe.ingredients.forEach((e) => this.checks.push(false));
},
mounted() {
this.yieldMultiplier = this.recipe.yield.quantity;
this.yieldMultiplier = this.recipe.yieldQuantity;
this.recipe.tried && this.recipe.lastTried && this.showLastTried();
},
};

View file

@ -50,7 +50,7 @@
import { Screen } from "@nativescript/core";
import { localize } from "@nativescript/localize";
import { mapState, mapActions } from "vuex";
import ConfirmDialog from "./ConfirmDialog.vue";
import Confirm from "./Confirm.vue";
interface IData {
newList: unknown[];
@ -92,7 +92,7 @@ export default {
this.$modal.close(item);
},
deletionConfirmation(description: string): void {
return this.$showModal(ConfirmDialog, {
return this.$showModal(Confirm, {
props: {
title: "conf",
description,

View file

@ -11,11 +11,7 @@
v-if="filteredRecipes.length || searchQuery"
class="input"
>
<TextField
class="modalInput"
:hint="'ser' | L"
v-model="searchQuery"
/>
<TextField class="modalInput" :hint="'ser' | L" v-model="searchQuery" />
</StackLayout>
<ListView row="2" for="recipe in filteredRecipes">
<v-template>
@ -48,7 +44,7 @@
<Button
col="2"
class="text sm"
:text="'CANCEL' | L"
:text="'cBtn' | L"
@tap="$modal.close(false)"
/>
</GridLayout>

View file

@ -66,12 +66,7 @@ export default {
return h.map((e) => `${e} ${localize("hr")}`);
},
minsList() {
let m = [
...new Set([
...Array(11).keys(),
...Array.from(Array(12), (_, x) => x * 5),
]),
];
let m = [...Array(60).keys()];
this.mins = m;
return m.map((e) => `${e} ${localize("min")}`);
},

View file

@ -0,0 +1,122 @@
<template>
<Page
@loaded="transparentPage"
backgroundColor="transparent"
:class="appTheme"
>
<GridLayout rows="auto, auto, auto" class="modal">
<Label class="title" :text="title | L" />
<StackLayout row="1">
<StackLayout class="input">
<TextField
class="modalInput"
v-model="setLabel"
:hint="label"
autocapitalizationType="words"
/></StackLayout>
<!-- @loaded="focusField" -->
<StackLayout orientation="horizontal" horizontalAlignment="center">
<ListPicker
@loaded="onLPLoad"
:items="hrsList"
@selectedIndexChange="setHr"
></ListPicker>
<ListPicker
@loaded="onLPLoad"
:items="minsList"
@selectedIndexChange="setMin"
></ListPicker>
<ListPicker
@loaded="onLPLoad"
:items="secsList"
@selectedIndexChange="setSec"
></ListPicker>
</StackLayout>
</StackLayout>
<GridLayout row="2" columns="auto, *, auto, auto" class="actions">
<Button
v-if="showPreset"
class="text sm"
:text="'prstBtn' | L"
@tap="$modal.close('presets')"
/>
<Button
col="2"
class="text sm"
:text="'cBtn' | L"
@tap="$modal.close(false)"
/>
<Button col="3" class="text sm" :text="action | L" @tap="sendRespose" />
</GridLayout>
</GridLayout>
</Page>
</template>
<script>
import { Utils } from "@nativescript/core";
import { localize } from "@nativescript/localize";
import { mapState } from "vuex";
export default {
props: ["title", "label", "action", "showPreset"],
data() {
return {
hrs: [],
mins: [],
secs: [],
selectedHrs: "00",
selectedMins: "00",
selectedSecs: "00",
setLabel: null,
};
},
computed: {
...mapState(["icon", "appTheme"]),
hrsList() {
let h = [...Array(24).keys()];
this.hrs = h;
return h.map((e) => `${e} ${localize("hr")}`);
},
minsList() {
let m = [...Array(60).keys()];
this.mins = m;
return m.map((e) => `${e} ${localize("min")}`);
},
secsList() {
let s = [...Array(60).keys()];
this.secs = s;
return s.map((e) => `${e} ${localize("sec")}`);
},
selectedTime() {
return `${this.selectedHrs}:${this.selectedMins}:${this.selectedSecs}`;
},
},
methods: {
onLPLoad({ object }) {
object.android.setWrapSelectorWheel(true);
},
setHr(args) {
let hr = "0" + this.hrs[args.object.selectedIndex];
this.selectedHrs = hr.slice(-2);
},
setMin(args) {
let min = "0" + this.mins[args.object.selectedIndex];
this.selectedMins = min.slice(-2);
},
setSec(args) {
let sec = "0" + this.secs[args.object.selectedIndex];
this.selectedSecs = sec.slice(-2);
},
focusField({ object }) {
object.focus();
setTimeout(() => Utils.ad.showSoftInput(object.android), 100);
},
sendRespose() {
this.$modal.close({
label: this.setLabel ? this.setLabel : this.label,
time: this.selectedTime,
});
},
},
};
</script>

View file

@ -12,11 +12,7 @@
</v-template>
<v-template if="$index == 1">
<StackLayout class="app-info">
<Image
class="icon"
src="res://logo"
stretch="none"
/>
<Image class="icon" src="res://logo" stretch="none" />
<Label class="name tb tac" :text="'EnRecipes' | L" />
<Label :text="getVersion" class="version tb tac" />
@ -99,9 +95,8 @@ export default {
},
},
methods: {
onPageLoad(args) {
const page = args.object;
page.bindingContext = new Observable();
onPageLoad({ object }) {
object.bindingContext = new Observable();
},
// HELPERS
openURL(url) {

View file

@ -0,0 +1,82 @@
<template>
<Page @loaded="onPageLoad" actionBarHidden="true">
<GridLayout rows="*, auto" columns="auto, *">
<OptionsList title="Settings" :items="items" :action="navigateTo" />
<GridLayout row="1" class="appbar" rows="*" columns="auto, *">
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
</GridLayout>
</Page>
</template>
<script lang="ts">
import { Observable } from "@nativescript/core";
import { mapState, mapActions } from "vuex";
import Interface from "./Interface.vue";
import Options from "./Options.vue";
import Database from "./Database.vue";
import Reset from "./Reset.vue";
import About from "./About.vue";
import OptionsList from "../sub/OptionsList.vue";
export default {
components: { OptionsList },
data() {
return {
items: [
{},
{
type: "list",
icon: "interface",
title: "intf",
data: Interface,
},
{
type: "list",
icon: "opts",
title: "opts",
data: Options,
},
{
type: "list",
icon: "db",
title: "db",
data: Database,
},
{
type: "list",
icon: "reset",
title: "rest",
data: Reset,
},
{
type: "list",
icon: "info",
title: "About",
data: About,
},
{},
],
};
},
computed: {
...mapState(["icon"]),
},
methods: {
...mapActions(["setComponent"]),
onPageLoad({ object }) {
object.bindingContext = new Observable();
this.setComponent("Settings");
},
// HELPERS
navigateTo(view) {
this.$navigateTo(view, {
transition: {
name: "slide",
duration: 200,
curve: "easeOut",
},
});
},
},
};
</script>

View file

@ -0,0 +1,134 @@
<template>
<Page @loaded="onPageLoad" actionBarHidden="true">
<GridLayout rows="*, auto" columns="auto, *">
<OptionsList title="Settings" :items="items" />
<GridLayout row="1" class="appbar" rows="*" columns="auto, *">
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
</GridLayout>
</Page>
</template>
<script>
import { Observable, Device, Application, Utils } from "@nativescript/core";
import { mapState, mapActions } from "vuex";
import { localize } from "@nativescript/localize";
import OptionsList from "../sub/OptionsList";
import Action from "../modals/Action";
import * as utils from "~/shared/utils";
export default {
components: { OptionsList },
computed: {
...mapState(["icon", "timerDelay", "timerSound", "timerVibrate"]),
items() {
let options = [
{
type: "list",
icon: "sound",
title: "tmrSnd",
subTitle: this.timerSound.title,
action: this.showSoundsList,
},
{
type: "switch",
icon: "vibrate",
title: "tmrvbrt",
checked: this.timerVibrate,
action: this.toggleTimerVibrate,
},
];
let openSettings = [
{
type: "list",
icon: "sound",
title: "notifSetg",
subTitle: null,
action: this.openNotificationChannelSettings,
},
];
let list = this.channelExists() ? openSettings : options;
return [
{},
{
type: "list",
icon: "delay",
title: "dlyDur",
subTitle: this.timerDelay,
action: this.showDelayList,
},
...list,
{},
];
},
},
methods: {
...mapActions([
"setTimerDelay",
"setTimerSound",
"setTimerVibrate",
"setComponent",
]),
onPageLoad({ object }) {
object.bindingContext = new Observable();
this.setComponent("CTSettings");
},
showDelayList() {
let list = [
...Array.from(Array(4), (_, x) => x + 1),
...Array.from(Array(6), (_, x) => (x + 1) * 5),
].map(
(e, i) => `${e} ${i == 0 ? localize("minute") : localize("minutes")}`
);
this.$showModal(Action, {
props: {
title: "dlyDur",
list,
},
}).then((dur) => dur && this.setTimerDelay(dur));
},
showSoundsList() {
let getTones = utils.getTones();
this.$showModal(Action, {
props: {
title: "tmrSnd",
list: getTones.tones.map((e) => e.title),
},
}).then(
(tone) =>
tone &&
tone !== this.timerSound.title &&
this.setTimerSound(getTones.tones.filter((e) => e.title === tone)[0])
);
},
toggleTimerVibrate() {
this.setTimerVibrate(!this.timerVibrate);
},
openNotificationChannelSettings() {
const ctx = Application.android.context;
const Settings = android.provider.Settings;
const Intent = android.content.Intent;
let intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
intent.putExtra(
Settings.EXTRA_APP_PACKAGE,
Application.android.packageName
);
intent.putExtra(Settings.EXTRA_CHANNEL_ID, "cta");
intent.setFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
ctx.startActivity(intent);
},
// HELPERS
channelExists() {
if (Device.sdkVersion * 1 >= 26) {
const ctx = Utils.ad.getApplicationContext();
const NotifySrv = ctx.getSystemService(
android.content.Context.NOTIFICATION_SERVICE
);
return NotifySrv.getNotificationChannel("cta");
}
return null;
},
},
};
</script>

View file

@ -1,32 +1,7 @@
<template>
<Page @loaded="onPageLoad" actionBarHidden="true">
<GridLayout rows="*, auto" columns="auto, *">
<ListView
colSpan="2"
rowSpan="2"
class="options-list"
for="item in items"
>
<v-template if="$index == 0">
<Label class="pageTitle" :text="'db' | L" />
</v-template>
<v-template if="$index == 4">
<StackLayout class="listSpace"> </StackLayout>
</v-template>
<v-template>
<GridLayout
columns="auto, *"
class="option"
@touch="touch($event, item.action)"
>
<Label class="ico" :text="icon[item.icon]" />
<StackLayout col="1" verticalAlignment="center">
<Label :text="item.title | L" class="info" />
<Label v-if="item.subTitle" :text="item.subTitle" class="sub" />
</StackLayout>
</GridLayout>
</v-template>
</ListView>
<OptionsList title="db" :items="items" />
<GridLayout
v-show="!toast && !progress"
row="1"
@ -36,18 +11,7 @@
>
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
<GridLayout
v-show="toast"
row="1"
colSpan="2"
class="appbar snackBar"
columns="*"
@tap="toast = null"
>
<FlexboxLayout minHeight="48" alignItems="center">
<Label class="title msg" :text="toast" />
</FlexboxLayout>
</GridLayout>
<Toast :toast="toast" :action="hideToast" />
<GridLayout
v-show="progress"
row="1"
@ -67,18 +31,23 @@ import {
ApplicationSettings,
path,
knownFolders,
AndroidApplication,
File,
Folder,
Observable,
Application,
getFileAccess,
} from "@nativescript/core";
import { localize } from "@nativescript/localize";
import ConfirmDialog from "../modal/ConfirmDialog.vue";
import Confirm from "../modals/Confirm";
import OptionsList from "../sub/OptionsList";
import Toast from "../sub/Toast";
import { mapState, mapActions } from "vuex";
import { openOrCreate } from "@akylas/nativescript-sqlite";
import * as utils from "~/shared/utils";
export default {
components: { OptionsList, Toast },
data() {
return {
backupFolder: null,
@ -101,18 +70,21 @@ export default {
return [
{},
{
type: "list",
icon: "folder",
title: "buFol",
subTitle: this.backupFolder,
action: this.setBackupFolder,
},
{
type: "list",
icon: "exp",
title: "expBu",
subTitle: localize("buInfo"),
action: this.exportCheck,
},
{
type: "list",
icon: "imp",
title: "impBu",
subTitle: localize("impInfo"),
@ -124,15 +96,16 @@ export default {
},
methods: {
...mapActions([
"importListItemsAction",
"importRecipesAction",
"importMealPlansAction",
"importListItems",
"importRecipesFromJSON",
"importRecipesFromDB",
"importMealPlansFromJSON",
"importMealPlansFromDB",
"unlinkBrokenImages",
"clearImportSummary",
]),
onPageLoad(args) {
const page = args.object;
page.bindingContext = new Observable();
onPageLoad({ object }) {
object.bindingContext = new Observable();
const ContentResolver = Application.android.nativeApp.getContentResolver();
this.backupFolder = ApplicationSettings.getString("backupFolder");
if (
@ -185,7 +158,7 @@ export default {
},
exportBackup() {
this.progress = localize("expip");
this.exportFiles("create");
this.hijackBackEvent();
let date = new Date();
let formattedDate =
date.getFullYear() +
@ -198,6 +171,9 @@ export default {
("0" + date.getMinutes()).slice(-2) +
("0" + date.getSeconds()).slice(-2);
// Copy db file to EnRecipes folder
utils.copyDBToExport();
let filename = `${localize("EnRecipes")}_${formattedDate}.zip`;
let fromPath = path.join(knownFolders.documents().path, "EnRecipes");
utils.Zip.zip(fromPath, this.backupFolder, filename)
@ -205,63 +181,22 @@ export default {
.catch((err) => {
console.log("Backup error: ", err);
this.progress = null;
this.releaseBackEvent();
this.setBackupFolder(true);
});
},
exportFiles(option) {
const folder = path.join(knownFolders.documents().path, "EnRecipes");
const EnRecipesFile = File.fromPath(path.join(folder, "recipes.json"));
let userCuisinesFile,
userCategoriesFile,
userYieldUnitsFile,
userUnitsFile,
mealPlansFile;
if (this.cuisines.length)
userCuisinesFile = File.fromPath(
path.join(folder, "userCuisines.json")
);
if (this.categories.length)
userCategoriesFile = File.fromPath(
path.join(folder, "userCategories.json")
);
if (this.yieldUnits.length)
userYieldUnitsFile = File.fromPath(
path.join(folder, "userYieldUnits.json")
);
if (this.units.length)
userUnitsFile = File.fromPath(path.join(folder, "userUnits.json"));
if (this.mealPlans.length)
mealPlansFile = File.fromPath(path.join(folder, "mealPlans.json"));
switch (option) {
case "create":
this.writeDataToFile(EnRecipesFile, this.recipes);
this.cuisines.length &&
this.writeDataToFile(userCuisinesFile, this.cuisines);
this.categories.length &&
this.writeDataToFile(userCategoriesFile, this.categories);
this.yieldUnits.length &&
this.writeDataToFile(userYieldUnitsFile, this.yieldUnits);
this.units.length && this.writeDataToFile(userUnitsFile, this.units);
this.mealPlans.length &&
this.writeDataToFile(mealPlansFile, this.mealPlans);
break;
case "delete":
EnRecipesFile.remove();
this.cuisines.length && userCuisinesFile.remove();
this.categories.length && userCategoriesFile.remove();
this.yieldUnits.length && userYieldUnitsFile.remove();
this.units.length && userUnitsFile.remove();
this.mealPlans.length && mealPlansFile.remove();
break;
}
},
writeDataToFile(file, data) {
file.writeText(JSON.stringify(data));
},
showExportSummary(filename) {
// delete copied db file
getFileAccess().deleteFile(
path.join(
knownFolders.documents().getFolder("EnRecipes").path,
"EnRecipes.db"
)
);
this.progress = null;
this.releaseBackEvent();
let description = localize("buto", `"${filename}"`);
this.$showModal(ConfirmDialog, {
this.$showModal(Confirm, {
props: {
title: "expSuc",
description,
@ -274,6 +209,7 @@ export default {
openZipFile() {
utils.getBackupFile().then((uri) => {
if (uri) {
knownFolders.temp().clear();
let dest = knownFolders.temp().path;
utils.Zip.unzip(uri, dest)
.then((res) => res && this.validateZipContent(res, uri))
@ -281,63 +217,77 @@ export default {
}
});
},
validateZipContent(extractedFolderPath, uri) {
validateZipContent(dest, uri) {
this.progress = localize("impip");
let cacheFolderPath = extractedFolderPath + "/EnRecipes";
const EnRecipesFilePath = cacheFolderPath + "/recipes.json";
const ImagesFolderPath = cacheFolderPath + "/Images";
const userCuisinesFilePath = cacheFolderPath + "/userCuisines.json";
const userCategoriesFilePath = cacheFolderPath + "/userCategories.json";
const userYieldUnitsFilePath = cacheFolderPath + "/userYieldUnits.json";
const userUnitsFilePath = cacheFolderPath + "/userUnits.json";
const mealPlansFilePath = cacheFolderPath + "/mealPlans.json";
if (Folder.exists(cacheFolderPath)) {
this.hijackBackEvent();
let cache = dest + "/EnRecipes";
const recipesDB = cache + "/EnRecipes.db";
const recipes = cache + "/recipes.json";
const images = cache + "/Images";
const userCuisines = cache + "/userCuisines.json";
const userCategories = cache + "/userCategories.json";
const userYieldUnits = cache + "/userYieldUnits.json";
const userUnits = cache + "/userUnits.json";
const mealPlans = cache + "/mealPlans.json";
let vm = this;
// IMPORT IMAGES FINALLY
function importImages() {
const timer = setInterval(() => {
if (!vm.progress) clearInterval(timer);
if (vm.progress && vm.importSummary.found) {
Folder.exists(images)
? vm.importImages(uri)
: vm.showImportSummary();
}
}, 100);
}
if (Folder.exists(cache)) {
if (File.exists(recipesDB)) {
// IMPORT FROM DB FILE
this.extractData(recipesDB);
importImages();
} else if (File.exists(recipes)) {
// IMPORT FROM JSON FILES
this.isFileDataValid([
{
path: EnRecipesFilePath,
db: "EnRecipesDB",
path: recipes,
db: "recipes",
file: "recipes.json",
},
{
path: userCuisinesFilePath,
db: "userCuisinesDB",
path: userCuisines,
db: "userCuisines",
file: "userCuisines.json",
},
{
path: userCategoriesFilePath,
db: "userCategoriesDB",
path: userCategories,
db: "userCategories",
file: "userCategories.json",
},
{
path: userYieldUnitsFilePath,
db: "userYieldUnitsDB",
path: userYieldUnits,
db: "userYieldUnits",
file: "userYieldUnits.json",
},
{
path: userUnitsFilePath,
db: "userUnitsDB",
path: userUnits,
db: "userUnits",
file: "userUnits.json",
},
{
path: mealPlansFilePath,
db: "mealPlansDB",
path: mealPlans,
db: "mealPlans",
file: "mealPlans.json",
},
]);
const timer = setInterval(() => {
if (!this.progress) clearInterval(timer);
if (this.progress && this.importSummary.found) {
Folder.exists(ImagesFolderPath)
? this.importImages(uri)
: this.showImportSummary();
}
}, 100);
importImages();
} else this.failedImport(localize("buEmp"));
} else this.failedImport(localize("buInc"));
},
isFileDataValid(file) {
const files = file.filter((e) => File.exists(e.path));
if (files.length) {
let isValid = files.map((e) => false);
let isValid = files.map(() => false);
files.forEach((file, i) => {
File.fromPath(file.path)
.readText()
@ -354,7 +304,7 @@ export default {
File.fromPath(file.path)
.readText()
.then((data) => {
this.importDataToDB(JSON.parse(data), file.db);
this.importData(JSON.parse(data), file.db);
});
});
}
@ -364,8 +314,9 @@ export default {
},
failedImport(description) {
this.progress = null;
this.releaseBackEvent();
knownFolders.temp().clear();
this.$showModal(ConfirmDialog, {
this.$showModal(Confirm, {
props: {
title: "impFail",
description,
@ -381,37 +332,62 @@ export default {
}
return true;
},
importDataToDB(data, db) {
extractData(recipesDB) {
const db = openOrCreate(recipesDB);
// Import recipes
db.select("SELECT * FROM recipes").then((res) => {
this.importRecipesFromDB(res);
});
// Import listitems
db.select(
`SELECT cuisines, categories, yieldUnits, units FROM lists`
).then((res) =>
Object.keys(res[0]).forEach((listName) =>
this.importListItems({
data: JSON.parse(res[0][listName]),
listName,
})
)
);
// Import mealPlans
db.select(`SELECT * FROM mealPlans`).then((res) =>
this.importMealPlansFromDB(res)
);
},
importData(data, db) {
switch (db) {
case "EnRecipesDB":
this.importRecipesAction(data);
case "recipes":
this.importRecipesFromJSON(data);
break;
case "userCuisinesDB":
this.importListItemsAction({
case "userCuisines":
this.importListItems({
data,
listName: "cuisines",
});
break;
case "userCategoriesDB":
this.importListItemsAction({
case "userCategories":
this.importListItems({
data,
listName: "categories",
});
break;
case "userYieldUnitsDB":
this.importListItemsAction({
case "userYieldUnits":
this.importListItems({
data,
listName: "yieldUnits",
});
break;
case "userUnitsDB":
this.importListItemsAction({
case "userUnits":
this.importListItems({
data,
listName: "units",
});
break;
case "mealPlansDB":
this.importMealPlansAction(data);
case "mealPlans":
this.importMealPlansFromJSON(data);
break;
}
},
@ -420,6 +396,16 @@ export default {
Folder.fromPath(destPath);
utils.Zip.unzip(uri, destPath).then((res) => {
if (res) {
// delete unzipped data files
Folder.fromPath(path.join(destPath, "EnRecipes"))
.getEntities()
.then((entities) => {
entities.forEach((entity) => {
if (/.json|.db/.test(entity._extension))
File.fromPath(entity._path).remove();
});
});
this.showImportSummary();
this.unlinkBrokenImages();
}
@ -427,14 +413,13 @@ export default {
},
showImportSummary() {
this.progress = null;
knownFolders.temp().clear();
this.exportFiles("delete");
this.releaseBackEvent();
let { found, imported, updated } = this.importSummary;
let exists = Math.abs(found - imported - updated) + updated;
let importedNote = `\n${localize("recI")} ${imported}`;
let existsNote = `\n${localize("recE")} ${exists}`;
let updatedNote = `\n${localize("recU")} ${updated}`;
this.$showModal(ConfirmDialog, {
this.$showModal(Confirm, {
props: {
title: "impSuc",
description: `${found} ${localize(
@ -445,10 +430,26 @@ export default {
}).then(() => this.clearImportSummary());
},
// NAVIGATION HANDLERS
hijackBackEvent() {
AndroidApplication.on(
AndroidApplication.activityBackPressedEvent,
this.backEvent
);
},
releaseBackEvent() {
AndroidApplication.off(
AndroidApplication.activityBackPressedEvent,
this.backEvent
);
},
backEvent(args) {
args.cancel = true;
},
// HELPERS
touch({ object, action }, method) {
object.className = action.match(/down|move/) ? "option fade" : "option";
if (action == "up") method();
hideToast() {
this.toast = null;
},
},
};

View file

@ -1,32 +1,7 @@
<template>
<Page @loaded="onPageLoad" actionBarHidden="true">
<GridLayout rows="*, auto" columns="auto, *">
<ListView
colSpan="2"
rowSpan="2"
class="options-list"
for="item in items"
>
<v-template if="$index == 0">
<Label class="pageTitle" :text="'intf' | L" />
</v-template>
<v-template if="$index == 4">
<StackLayout class="listSpace"> </StackLayout>
</v-template>
<v-template>
<GridLayout
columns="auto, *"
class="option"
@touch="touch($event, item.action)"
>
<Label class="ico" :text="icon[item.icon]" />
<StackLayout col="1">
<Label :text="item.title | L" class="info" />
<Label :text="item.subTitle" class="sub" />
</StackLayout>
</GridLayout>
</v-template>
</ListView>
<OptionsList title="intf" :items="items" />
<GridLayout row="1" class="appbar" rows="*" columns="auto, *">
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
@ -42,12 +17,14 @@ import {
Frame,
} from "@nativescript/core";
import { localize, overrideLocale } from "@nativescript/localize";
import ActionDialog from "../modal/ActionDialog.vue";
import ConfirmDialog from "../modal/ConfirmDialog.vue";
import Action from "../modals/Action";
import Confirm from "../modals/Confirm";
import OptionsList from "../sub/OptionsList";
import { mapState, mapActions } from "vuex";
import * as utils from "~/shared/utils";
export default {
components: { OptionsList },
data() {
return {
appLanguage: "English",
@ -59,12 +36,14 @@ export default {
return [
{},
{
type: "list",
icon: "lang",
title: "lang",
subTitle: this.appLanguage,
action: this.selectAppLanguage,
},
{
type: "list",
icon: "theme",
title: "Theme",
subTitle: localize(
@ -73,6 +52,7 @@ export default {
action: this.selectThemes,
},
{
type: "list",
icon: "layout",
title: "listVM",
subTitle: localize(this.layout),
@ -84,25 +64,24 @@ export default {
},
methods: {
...mapActions(["setTheme", "setLayout"]),
onPageLoad(args) {
const page = args.object;
page.bindingContext = new Observable();
onPageLoad({ object }) {
object.bindingContext = new Observable();
},
// LANGUAGE SELECTION
selectAppLanguage() {
let languages = this.language.map((e) => e.title);
this.$showModal(ActionDialog, {
this.$showModal(Action, {
props: {
title: "lang",
list: [...languages],
},
}).then((action) => {
if (action && action !== "Cancel" && this.appLanguage !== action) {
if (action && this.appLanguage !== action) {
let currentLocale = Device.language.split("-")[0];
let locale = this.language.filter((e) => e.title === action)[0]
.locale;
if (currentLocale !== locale) {
this.$showModal(ConfirmDialog, {
this.$showModal(Confirm, {
props: {
title: "appRst",
description: localize("nLangInfo"),
@ -123,7 +102,7 @@ export default {
},
// THEME SELECTION
selectThemes() {
this.$showModal(ActionDialog, {
this.$showModal(Action, {
props: {
title: "Theme",
list: ["Light", "Dark", "Black", "sysDef", "sysDefB"],
@ -142,26 +121,21 @@ export default {
},
// LAYOUT MODE
setLayoutMode() {
this.$showModal(ActionDialog, {
this.$showModal(Action, {
props: {
title: "listVM",
list: ["detailed", "grid", "photogrid", "simple", "minimal"],
},
}).then((action) => {
if (action && action !== "Cancel" && this.layoutMode !== action) {
if (action && this.layoutMode !== action) {
let act = action.toLowerCase();
ApplicationSettings.setString("layout", act);
this.setLayout(act);
}
});
},
// HELPERS
touch({ object, action }, method) {
object.className = action.match(/down|move/) ? "option fade" : "option";
if (action == "up") method();
},
},
mounted() {
created() {
this.appLanguage = ApplicationSettings.getString(
"appLanguage",
localize("sysDef")

View file

@ -0,0 +1,45 @@
<template>
<Page @loaded="onPageLoad" actionBarHidden="true">
<GridLayout rows="*, auto" columns="auto, *">
<OptionsList title="Settings" :items="items" />
<GridLayout row="1" class="appbar" rows="*" columns="auto, *">
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
</GridLayout>
</Page>
</template>
<script>
import { Observable } from "@nativescript/core";
import { mapState, mapActions } from "vuex";
import OptionsList from "../sub/OptionsList";
export default {
components: { OptionsList },
computed: {
...mapState(["icon", "mondayFirst"]),
items() {
return [
{},
{
type: "switch",
icon: "week",
title: "swm",
checked: this.mondayFirst,
action: this.toggleFirstDay,
},
{},
];
},
},
methods: {
...mapActions(["setFirstDay"]),
onPageLoad({ object }) {
object.bindingContext = new Observable();
},
toggleFirstDay() {
this.setFirstDay(!this.mondayFirst);
},
},
};
</script>

View file

@ -0,0 +1,69 @@
<template>
<Page @loaded="onPageLoad" actionBarHidden="true">
<GridLayout rows="*, auto" columns="auto, *">
<OptionsList title="opts" :items="items" />
<GridLayout
v-show="!toast"
row="1"
class="appbar"
rows="*"
columns="auto, *"
>
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
<Toast :toast="toast" :action="(toast = null)" />
</GridLayout>
</Page>
</template>
<script>
import { Observable } from "@nativescript/core";
import { mapState, mapActions } from "vuex";
import { localize } from "@nativescript/localize";
import OptionsList from "../sub/OptionsList";
import Toast from "../sub/Toast";
import * as utils from "~/shared/utils";
export default {
components: { OptionsList, Toast },
data() {
return {
toast: null,
};
},
computed: {
...mapState(["icon", "shakeEnabled"]),
items() {
return [
{},
{
type: "switch",
icon: "shuf",
title: "sVw",
subTitle: "sVwInfo",
checked: this.shakeEnabled,
action: this.toggleShake,
},
{},
];
},
},
methods: {
...mapActions(["setShake"]),
onPageLoad({ object }) {
object.bindingContext = new Observable();
},
// SHAKE VIEW RANDOM RECIPE
toggleShake() {
let checked = this.shakeEnabled;
if (checked && !utils.hasAccelerometer()) {
this.toast = localize("noAccSensor");
utils.timer(5, (val) => {
if (!val) this.toast = val;
});
} else this.setShake(!checked);
},
},
};
</script>

View file

@ -0,0 +1,110 @@
<template>
<Page @loaded="onPageLoad" actionBarHidden="true">
<GridLayout rows="*, auto" columns="auto, *">
<OptionsList title="rest" :items="items" :action="resetListItems" />
<GridLayout
:hidden="toast"
row="1"
class="appbar"
@loaded="onAppBarLoad"
columns="auto, *"
>
<Button class="ico" :text="icon.back" @tap="$navigateBack()" />
</GridLayout>
<Toast :toast="toast" :action="hideToast" />
</GridLayout>
</Page>
</template>
<script>
import { Observable, CoreTypes } from "@nativescript/core";
import { localize } from "@nativescript/localize";
import { mapState, mapActions } from "vuex";
import * as utils from "~/shared/utils";
import OptionsList from "../sub/OptionsList";
import Toast from "../sub/Toast";
export default {
components: { OptionsList, Toast },
data() {
return {
toast: null,
appbar: null,
};
},
computed: {
...mapState(["icon"]),
items() {
return [
{},
{
type: "list",
icon: "reset",
title: "restCuiL",
data: "cuisines",
},
{
type: "list",
icon: "reset",
title: "restCatL",
data: "categories",
},
{
type: "list",
icon: "reset",
title: "restYUL",
data: "yieldUnits",
},
{
type: "list",
icon: "reset",
title: "restUL",
data: "units",
},
{},
{},
];
},
},
methods: {
...mapActions(["resetListItemsAction"]),
onPageLoad({ object }) {
object.bindingContext = new Observable();
},
onAppBarLoad({ object }) {
this.appbar = object;
},
// RESET
resetListItems(listName) {
this.resetListItemsAction(listName);
this.showToast();
},
showToast() {
this.toast = localize("restDone");
utils.timer(5, (val) => {
if (!val) this.toast = val;
});
},
hideToast({ object }) {
this.appbar.translateY = 64;
object
.animate({
opacity: 0,
translate: { x: 0, y: 64 },
duration: 250,
curve: CoreTypes.AnimationCurve.ease,
})
.then(() => {
this.showUndo = false;
this.toast = null;
this.appbar.animate({
translate: { x: 0, y: 0 },
duration: 250,
curve: CoreTypes.AnimationCurve.ease,
});
object.opacity = 1;
object.translateY = 0;
});
},
},
};
</script>

View file

@ -0,0 +1,62 @@
<template>
<ListView colSpan="2" rowSpan="2" class="options-list" for="item in items">
<v-template if="$index == 0">
<Label class="pageTitle" :text="title | L" />
</v-template>
<v-template if="item.type == 'switch'">
<GridLayout
columns="auto, *, auto"
class="option"
@touch="touch($event, item.data, item.action)"
>
<Label class="ico" :text="icon[item.icon]" />
<StackLayout col="1" verticalAlignment="center">
<Label :text="item.title | L" class="info" />
<Label v-if="item.subTitle" :text="item.subTitle | L" class="sub" />
</StackLayout>
<Switch
isUserInteractionEnabled="false"
:color="item.checked ? '#ff5200' : '#adb5bd'"
col="2"
:checked="item.checked"
/>
</GridLayout>
</v-template>
<v-template if="item.type == 'list'">
<GridLayout
columns="auto, *"
class="option"
@touch="touch($event, item.data, item.action)"
>
<Label class="ico" :text="icon[item.icon]" />
<StackLayout col="1">
<Label :text="item.title | L" class="info" />
<Label v-if="item.subTitle" :text="item.subTitle" class="sub" />
</StackLayout>
</GridLayout>
</v-template>
<v-template if="item.type == 'info'">
<Label class="group-info sub tw" :text="item.title | L" />
</v-template>
<v-template>
<StackLayout class="listSpace"> </StackLayout>
</v-template>
</ListView>
</template>
<script>
import { mapState } from "vuex";
export default {
props: ["title", "items", "action"],
computed: {
...mapState(["icon"]),
},
methods: {
touch({ object, action }, data, localAction) {
object.className = action.match(/down|move/) ? "option fade" : "option";
if (action == "up") localAction ? localAction(data) : this.action(data);
},
},
};
</script>

View file

@ -0,0 +1,23 @@
<template>
<GridLayout
row="1"
class="appbar snackBar"
columns="auto, *, auto"
@swipe="action"
>
<Button :text="count" class="ico countdown tb" />
<Label class="title" col="1" :text="msg | L" />
<Button class="ico fab" :text="icon.undo" @tap="undo" col="3" />
</GridLayout>
</template>
<script>
import { mapState } from "vuex";
export default {
props: ["count", "msg", "undo", "action"],
computed: {
...mapState(["icon"]),
},
};
</script>

View file

@ -0,0 +1,196 @@
<template>
<GridLayout
rows="auto, auto"
columns="auto, *, auto, auto, auto"
class="singleTimer"
>
<!-- :class="{ blink: done }" -->
<Button
class="ico"
:text="done ? icon.ring : timer.isPaused ? icon.start : icon.pause"
@tap="!done && toggleProgress()"
/>
<StackLayout col="1" class="info" :colSpan="timer.isPaused ? 1 : 2">
<Label :text="timer.label" class="tb title tw" />
<Label
@touch="!timer.recipeID && touch($event)"
:text="getRecipeTitle"
class="recipeTitle"
:class="timer.recipeID ? 'sub' : 'clickable'"
/>
<Label :text="formattedTime(timer.time)" />
</StackLayout>
<Button
col="2"
class="ico"
:hidden="(!timer.isPaused || progress == 0) && !done"
:text="icon.reset"
@tap="resetTimer"
/>
<Button
col="3"
class="ico"
:hidden="timer.preset && !done"
@tap="done ? delay() : addPreset()"
:text="done ? icon.delay : icon.addTo"
/>
<Button
col="4"
class="ico x"
:text="icon.x"
@tap="removeTimerItem(timerIndex, false)"
/>
<Progress row="1" colSpan="5" :value="progress" />
</GridLayout>
</template>
<script>
import { ApplicationSettings, Application } from "@nativescript/core";
import { localize } from "@nativescript/localize";
import { mapState, mapActions } from "vuex";
import ActionWithSearch from "../modals/ActionWithSearch";
import * as utils from "~/shared/utils";
import { EventBus } from "~/main";
export default {
props: [
"timer",
"timerIndex",
"formattedTime",
"removeTimer",
"addToPreset",
"togglePause",
"fireTimer",
],
data() {
return {
progress: 0,
timerInt: this.timer.timerInterval,
};
},
computed: {
...mapState(["icon", "recipes", "timerDelay"]),
getRecipeTitle() {
let { recipeID } = this.timer;
if (recipeID) {
let recipe = this.recipes.filter(
(e) => e.id === this.timer.recipeID
)[0];
return recipe
? recipe.title
: `[ ${this.$options.filters.L("resNF")} ]`;
} else return localize("fwr");
},
done() {
return this.progress >= 100;
},
getTimeInSec() {
let t = this.timer.time.split(":");
return +t[0] * 60 * 60 + +t[1] * 60 + +t[2];
},
},
methods: {
...mapActions(["removeActiveTimer", "updateActiveTimer", "addTimerPreset"]),
attachRecipe() {
this.$showModal(ActionWithSearch, {
props: {
title: "selRec",
recipes: this.recipes,
},
}).then((recipeID) => {
let timer = this.timer;
timer.recipeID = recipeID;
this.updateActiveTimer(timer);
});
},
setProgress(progress, delay) {
this.progress = progress;
let timer = this.timer;
if (progress <= 100 && !timer.timerInterval) {
timer.timerInterval = setInterval(() => {
if (!this.timer.isPaused) {
this.progress += 100 / (delay + this.getTimeInSec);
ApplicationSettings.setNumber(
`${this.timer.id}progress`,
this.progress
);
}
if (this.progress >= 100) {
if (progress < 100) this.fireTimer(timer);
clearInterval(timer.timerInterval);
ApplicationSettings.remove(`${this.timer.id}delay`);
}
}, 1000);
this.updateActiveTimer(timer);
}
},
resetInterval() {
let timer = this.timer;
clearInterval(this.timer.timerInterval);
timer.timerInterval = null;
this.updateActiveTimer(timer);
},
resetTimer() {
this.resetInterval();
this.togglePause(this.timer, true);
ApplicationSettings.remove(`${this.timer.id}delay`);
this.setProgress(0, 0);
ApplicationSettings.setNumber(`${this.timer.id}progress`, 0);
this.clearNotification();
},
clearNotification() {
Application.android.unregisterBroadcastReceiver("timer" + this.timer.id);
utils.TimerNotif.clear(this.timer.id);
},
toggleProgress(bool) {
this.togglePause(this.timer, bool);
this.timer.isPaused
? this.resetInterval()
: this.setProgress(
ApplicationSettings.getNumber(`${this.timer.id}progress`, 0),
ApplicationSettings.getNumber(`${this.timer.id}delay`, 0)
);
},
removeTimerItem(index, noUndo) {
this.resetInterval();
this.removeTimer(this.timer.id, index, noUndo);
},
addPreset() {
this.timer.preset = 1;
this.addToPreset(this.timer);
},
delay() {
let delayInS = this.timerDelay.split(" ")[0] * 60;
ApplicationSettings.setNumber(`${this.timer.id}delay`, delayInS);
let progress = (100 / delayInS) * this.getTimeInSec;
this.resetInterval();
this.setProgress(progress, delayInS);
this.clearNotification();
},
// HELPERS
touch({ object, action }) {
object.className = action.match(/down|move/)
? "recipeTitle clickable fade"
: "recipeTitle clickable";
if (action == "up") this.attachRecipe();
},
},
mounted() {
this.setProgress(
ApplicationSettings.getNumber(`${this.timer.id}progress`, 0),
ApplicationSettings.getNumber(`${this.timer.id}delay`, 0)
);
EventBus.$on("timer" + this.timer.id, (e) => {
switch (e) {
case "stop":
this.resetTimer();
break;
case "delay":
this.delay();
break;
}
});
},
};
</script>

View file

@ -0,0 +1,20 @@
<template>
<GridLayout
v-show="toast"
row="1"
colSpan="2"
class="appbar snackBar"
columns="*"
@swipe="action"
>
<FlexboxLayout minHeight="48" alignItems="center">
<Label class="title msg" :text="toast" />
</FlexboxLayout>
</GridLayout>
</template>
<script>
export default {
props: ["toast", "action"],
};
</script>

Binary file not shown.

View file

@ -12,7 +12,7 @@
"American": "أمريكية",
"aNBtn": "أضف جديدة",
"aNoBtn": "أضف ملاحظة",
"app.name": "",
"app.name": "EnRecipes",
"appCrd": "شورك عبر EnRecipes. احصل عليه على F-Droid, IzzyOnDroid, أو متجر بلاي.",
"Appetizers": "مقبلات",
"appInfo": "EnRecipes كتاب طبخ مفتوح المصدر صديق للخصوصية يتيح لك إنشاء وصفاتك و إدارتها ومشاركتها",
@ -70,7 +70,7 @@
"editRec": "عدل الوصفة",
"Egyptian": "مصرية",
"English": "إنجليزية",
"EnRecipes": "",
"EnRecipes": "EnRecipes",
"expBu": "صدر نسخة احتياطية كاملة",
"expip": "جار التصدير",
"expSuc": "نجح التصدير",

View file

@ -298,7 +298,8 @@
"delay": "Delay",
"tmr": "Timer %s",
"prstBtn": "PRESETS",
"tmrPrsts": "Timer presets",
"prsts": "Presets",
"delPrst": "You are about to delete %s from the presets",
"fwr": "for which recipe?",
"aTPrst": "Added to presets",
"tmrSnd": "Timer sound",
@ -309,5 +310,6 @@
"hour": "hour",
"hours": "hours",
"seconds": "seconds",
"tmrClr": "Timer cleared"
"tmrRm": "Timer removed",
"notifSetg": "Notification settings"
}

View file

@ -12,7 +12,7 @@
"American": "amerikkalainen",
"aNBtn": "LISÄÄ UUSI",
"aNoBtn": "LISÄÄ HUOMAUTUS",
"app.name": "",
"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",
@ -70,7 +70,7 @@
"editRec": "Muokkaa resepti",
"Egyptian": "egyptiläinen",
"English": "englantilainen",
"EnRecipes": "",
"EnRecipes": "EnRecipes",
"expBu": "Vie koko varmuuskopio",
"expip": "Vienti käynnissä",
"expSuc": "",

View file

@ -12,6 +12,7 @@
"American": "アメリカ料理",
"aNBtn": "新しく追加",
"aNoBtn": "メモを追加",
"app.name": "EnRecipes",
"appCrd": "EnRecipesから共有されました。F-DroidかIzzyOnDroidかPlayストアからダウンロード出来ます。",
"Appetizers": "前菜",
"appInfo": "EnRecipesはレシピを作成・管理・共有することができる、オープンソースでプライバシーに配慮したデジタル料理本です",
@ -69,6 +70,7 @@
"editRec": "レシピを編集する",
"Egyptian": "エジプト料理",
"English": "イングランド料理",
"EnRecipes": "EnRecipes",
"expBu": "バックアップをエクスポート",
"expip": "エクスポートを実行中",
"expSuc": "エクスポートに成功",

View file

@ -2,20 +2,56 @@ import {
localize,
androidLaunchEventLocalizationHandler,
} from '@nativescript/localize'
import { on, launchEvent } from '@nativescript/core/application'
on(launchEvent, (args) => {
import { Application, AndroidApplication, Utils } from '@nativescript/core'
const keepScreenOn = () => {
let ctx = Utils.ad.getApplicationContext()
const pm = ctx.getSystemService(android.content.Context.POWER_SERVICE)
let isScreenOff = !pm.isInteractive()
if (isScreenOff) {
console.log('keepScreenOn')
const window = Application.android.startActivity.getWindow()
const windowMgr = android.view.WindowManager
const flags =
windowMgr.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
windowMgr.LayoutParams.FLAG_TURN_SCREEN_ON |
windowMgr.LayoutParams.FLAG_KEEP_SCREEN_ON
window.addFlags(flags)
function clearFlags(args) {
args.cancel = true
window.clearFlags(flags)
Application.android.off(
AndroidApplication.activityBackPressedEvent,
clearFlags
)
}
Application.android.on(
AndroidApplication.activityBackPressedEvent,
clearFlags
)
}
}
Application.on(Application.resumeEvent, keepScreenOn)
Application.on(Application.launchEvent, (args) => {
console.log('launching')
if (args.android) {
androidLaunchEventLocalizationHandler()
intentListener(args)
}
})
import Vue from 'nativescript-vue'
import EnRecipes from './components/EnRecipes.vue'
import CookingTimer from './components/CookingTimer.vue'
import store from './store'
export const EventBus = new Vue()
import CollectionView from '@nativescript-community/ui-collectionview/vue'
Vue.use(CollectionView)
import { lvMixin } from './shared/mixins.js'
import { lvMixin } from './shared/mixins'
Vue.mixin(lvMixin)
Vue.config.silent = false
@ -26,3 +62,35 @@ new Vue({
store,
render: (h) => h(EnRecipes),
}).$start()
const intentListener = ({ intent, android }: any) => {
let ct = 'CookingTimer'
let action = (intent || android).getStringExtra('action')
console.log('calling: ', action)
if (action == 'open_timer' && store.state.currentComponent != ct) {
let openTimer = setInterval(() => {
let comp = store.state.currentComponent
if (comp == ct) clearInterval(openTimer)
else {
if (comp == 'CTSettings') Vue.navigateBack()
else {
Vue.navigateTo(CookingTimer)
store.commit('setComponent', 'CookingTimer')
}
}
}, 250)
}
}
Application.on(Application.launchEvent, () => {
Application.android.on(
AndroidApplication.activityNewIntentEvent,
intentListener
)
})
Application.on(Application.exitEvent, () => {
store.commit('setComponent', 'EnRecipes')
Application.android.off(
AndroidApplication.activityNewIntentEvent,
intentListener
)
})

View file

@ -15,29 +15,18 @@
android {
defaultConfig {
versionCode 8
versionName '1.3.3'
applicationId 'com.vishnuraghav.enrecipes'
minSdkVersion 23
versionCode 1
versionName '2.0.0'
minSdkVersion 21
targetSdkVersion 30
compileSdkVersion 30
generatedDensities = []
ndk {
abiFilters.clear()
abiFilters.addAll(['arm64-v8a', 'armeabi-v7a', 'x86'])
}
// ndk {
// abiFilters.clear()
// abiFilters.addAll(['arm64-v8a'])
// }
}
aaptOptions {
additionalParameters "--no-version-vectors"
}
// buildTypes {
// release {
// minifyEnabled true
// shrinkResources false
// debuggable false
// jniDebuggable false
// renderscriptDebuggable false
// }
// }
}

View file

@ -1,17 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="__PACKAGE__" android:versionCode="10000" android:versionName="1.0">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" tools:targetApi="28" />
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" tools:targetApi="29" />
<uses-permission android:name="android.permission.CAMERA" tools:node="remove" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" tools:node="remove" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="remove" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" tools:node="remove" />
<uses-permission android:name="android.permission.INTERNET" tools:node="remove" />
<uses-permission android:name="android.permission.RECORD_AUDIO" tools:node="remove" />
<application android:extractNativeLibs="true"
android:name="com.tns.NativeScriptApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:hardwareAccelerated="true" android:largeHeap="true" android:theme="@style/AppTheme">
<activity android:name="com.tns.NativeScriptActivity" android:label="@string/title_activity_kimera" android:screenOrientation="userPortrait" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout|locale|uiMode" android:theme="@style/LaunchScreenTheme" android:windowSoftInputMode="adjustResize">
<application android:extractNativeLibs="true" android:name="com.tns.NativeScriptApplication" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:hardwareAccelerated="true" android:largeHeap="true" android:theme="@style/AppTheme">
<activity android:name="com.tns.NativeScriptActivity" android:label="@string/title_activity_kimera" android:launchMode="singleInstance" android:screenOrientation="userPortrait" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize|screenLayout|locale|uiMode" android:theme="@style/LaunchScreenTheme" android:windowSoftInputMode="adjustResize">
<meta-data android:name="SET_THEME_ON_LAUNCH" android:resource="@style/AppTheme" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@ -19,14 +20,9 @@
</intent-filter>
</activity>
<activity android:name="com.tns.ErrorReportActivity" />
<provider
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:authorities="${applicationId}.provider"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider"/>
<service android:name="com.tns.ForegroundService" android:enabled="true" android:exported="false" />
<provider android:name="androidx.core.content.FileProvider" android:exported="false" android:authorities="${applicationId}.provider" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider" />
</provider>
</application>
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 954 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 938 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 754 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 860 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 852 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,016 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,016 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,318 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tmrClr">"Timer cleared"</string>
<string name="seconds">"ثوان"</string>
<string name="hours">"ساعات"</string>
<string name="hour">"ساعة"</string>
<string name="minutes">"دقائق"</string>
<string name="minute">"دقيقة"</string>
<string name="dlyDur">"مدة التأخير"</string>
<string name="tmrvbrt">"اهتزاز المؤقت"</string>
<string name="tmrSnd">"صوت المؤقت"</string>
<string name="aTPrst">"Added to presets"</string>
<string name="fwr">"لأي وصفة؟"</string>
<string name="tmrPrsts">"Timer presets"</string>
<string name="prstBtn">"PRESETS"</string>
<string name="tmr">"مؤقت %1$s"</string>
<string name="delay">"التأخير"</string>
<string name="stop">"قف"</string>
<string name="strtBtn">"ابدأ"</string>
<string name="ntmr">"مؤقت جديد"</string>
<string name="timer">"Cooking Timer"</string>
<string name="sysDefB">"System default + Black"</string>
<string name="buto">"Backed up to %1$s"</string>
<string name="yld">"Yield"</string>
<string name="yieldU">"Yield unit"</string>
<string name="yieldQ">"Yield quantity"</string>
<string name="yesterday">"أمس"</string>
<string name="WED">"WED"</string>
<string name="wAgo">"قبل %1$s أسابيع"</string>
<string name="Vietnamese">"فيتنامية"</string>
<string name="Vegetarian">"نباتي"</string>
<string name="Vegan">"نباتي صرف"</string>
<string name="untRec">"Untitled Recipe"</string>
<string name="unsaved">"تغيرات غبر محفوظة"</string>
<string name="Unit">"وحدة"</string>
<string name="unit">"وحدة"</string>
<string name="Undefined">"Undefined"</string>
<string name="Turkish">"تركية"</string>
<string name="TUE">"TUE"</string>
<string name="tsp">"tsp"</string>
<string name="tsInfo">"separate with spaces"</string>
<string name="ts">"العلامات"</string>
<string name="trySer">"ابحث في كل الوصفات؟"</string>
<string name="trylater">"حاول لاحقاً"</string>
<string name="trnsl">"ترجم"</string>
<string name="triedInfo">"جربت هذه الوصفة %1$s"</string>
<string name="today">"اليوم"</string>
<string name="tLInfo">"الوصفات التي تريد تجربتها مسرودة هنا"</string>
<string name="title">"العنوان"</string>
<string name="THU">"THU"</string>
<string name="Theme">"السمة"</string>
<string name="Thai">"تايلندية"</string>
<string name="Teaspoon">"ملعقة شاي"</string>
<string name="tbsp">"tbsp"</string>
<string name="Tablespoon">"ملعقة"</string>
<string name="sysDef">"System default"</string>
<string name="swm">"ابدأ الاسبوع يوم الاثنين"</string>
<string name="Swedish">"سويدية"</string>
<string name="sVwInfo">"لمساعدتك على اختيار ما تطبخ عندما لا تستطيع الاختيار"</string>
<string name="sVw">"هز لرؤية وصفة عشوائية"</string>
<string name="SUN">"SUN"</string>
<string name="strAdd">"ابدأ إضافة وصفاتك!"</string>
<string name="stp">"خطوة"</string>
<string name="stick">"stick"</string>
<string name="stars">"التقييم النجمي"</string>
<string name="sru">"شارك وصفة باستعمال..."</string>
<string name="srt">"Sort"</string>
<string name="srpu">"شارك صورة الوصفة باستعمال..."</string>
<string name="_Sri_Lankan_Z7GfBa">"سري لانكية"</string>
<string name="Spanish">"اسبانية"</string>
<string name="Soups">"شوربات"</string>
<string name="snacks">"وجبات خفيفة"</string>
<string name="small">"صغير"</string>
<string name="sltd">"المختارة"</string>
<string name="_Slowest_first_hHjY6">"الأبطأ أولاً"</string>
<string name="simple">"بسيط"</string>
<string name="_Side_dishes_Z1Et4Vg">"الأطباق الجانبية"</string>
<string name="shr">"شارك"</string>
<string name="Settings">"الإعدادات"</string>
<string name="SET">"SET"</string>
<string name="Serving">"Serving"</string>
<string name="ser">"ابحث"</string>
<string name="September">"سبتمبر"</string>
<string name="selRec">"اختر وصفة"</string>
<string name="Seafood">"بحرية"</string>
<string name="Scottish">"سكتلندية"</string>
<string name="Sauces">"صلصات"</string>
<string name="SAT">"SAT"</string>
<string name="Salads">"سلطات"</string>
<string name="Russian">"روسية"</string>
<string name="rst">"أعد التشغيل"</string>
<string name="rp">"Remove photo"</string>
<string name="Roll">"لفة"</string>
<string name="rmYUInfo">"You are about to remove %1$s from the yield unit list"</string>
<string name="rmUInfo">"You are about to remove %1$s from the unit list"</string>
<string name="rmN">"Note removed"</string>
<string name="rmIns">"Instruction removed"</string>
<string name="rmIng">"Ingredient removed"</string>
<string name="rmCuiInfo">"You are about to remove %1$s from the cuisine list"</string>
<string name="rmCmb">"Combination removed"</string>
<string name="rmCatInfo">"You are about to remove %1$s from the category list"</string>
<string name="Rice">"أرز"</string>
<string name="restYUL">"Reset yield unit list"</string>
<string name="restUL">"Reset unit list"</string>
<string name="restInfo">"Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."</string>
<string name="restDone">"Reset done"</string>
<string name="restCuiL">"Reset cuisine list"</string>
<string name="restCatL">"Reset category list"</string>
<string name="rest">"Reset"</string>
<string name="resNF">"Recipe not found"</string>
<string name="req">"Required %1$s"</string>
<string name="recU">"Updated:"</string>
<string name="recTitle">"وصفتي الصحية"</string>
<string name="recs">"الوصفات"</string>
<string name="recRm">"Recipe removed"</string>
<string name="recPic">"صورة الوصفة"</string>
<string name="recListEmp">"لا شيء هنا! أضف بعض الوصفات ثم حاول مجدداً"</string>
<string name="recI">"المستورد:"</string>
<string name="recF">"recipes found"</string>
<string name="recE">"Already exist:"</string>
<string name="rec">"الوصفة"</string>
<string name="rBtn">"REMOVE"</string>
<string name="Rating">"التقييم"</string>
<string name="_Quickest_first_Z1CpP7N">"الاسرع أولاً"</string>
<string name="qt">"qt"</string>
<string name="pt">"pt"</string>
<string name="priv">"سياسة الخصوصية"</string>
<string name="prepT">"وقت التحضير"</string>
<string name="Pound">"رطل"</string>
<string name="Poultry">"دواجن"</string>
<string name="Portuguese">"برتغالية"</string>
<string name="plsAdd">"استعمل زر الزائد لإضافة واحدة"</string>
<string name="planner">"مخططة الوجبات"</string>
<string name="pinch">"رشة"</string>
<string name="Piece">"قطعة"</string>
<string name="piece">"قطعة"</string>
<string name="pht">"صورة الوصفة"</string>
<string name="photogrid">"Photo Grid"</string>
<string name="Patty">"فطيرة"</string>
<string name="Pasta">"باستا"</string>
<string name="oz">"oz"</string>
<string name="Ounce">"أونصة"</string>
<string name="opts">"الاعدادات"</string>
<string name="_Oldest_first_Z6cq4h">"الأقدم أولاً"</string>
<string name="OK">"OK"</string>
<string name="October">"أكتوبر"</string>
<string name="nwYiU">"New yield unit"</string>
<string name="nwCat">"صنف جديد"</string>
<string name="November">"نوفمبر"</string>
<string name="nos">"ملاحظات"</string>
<string name="noRecsInL">"None of the recipes here matches your search"</string>
<string name="noRecs">"لا وصفات مطابقة لبحثك"</string>
<string name="Noodles">"نودلز"</string>
<string name="noFavs">"No favourites yet"</string>
<string name="noAccSensor">"مقياس التسارع إما معطل أو لا يعمل"</string>
<string name="no">"ملاحظة"</string>
<string name="nNBtn">"ليس الآن"</string>
<string name="nLangInfo">"أعد تشغيل EnRecipes لاستخدام اللغة الجديدة"</string>
<string name="Nigerian">"نيجيرية"</string>
<string name="newUnit">"وحدة جديدة"</string>
<string name="newRec">"وصفة جديدة"</string>
<string name="_Newest_first_2Sb3c">"الأجد أولاً"</string>
<string name="newCui">"مطبخ جديد"</string>
<string name="MON">"MON"</string>
<string name="Moderate">"متوسطة"</string>
<string name="ml">"مل"</string>
<string name="minimal">"Minimal"</string>
<string name="sec">"sec"</string>
<string name="min">"min"</string>
<string name="Millilitre">"مللتر"</string>
<string name="mg">"مغ"</string>
<string name="Mexican">"مكسيكية"</string>
<string name="medium">"medium"</string>
<string name="Meat">"لحم"</string>
<string name="May">"مايو"</string>
<string name="March">"مارس"</string>
<string name="_Main_dishes_u6RGQ">"الأطباق الرئيسة"</string>
<string name="mAgo">"منذ %1$s أشهر"</string>
<string name="lunch">"غداء"</string>
<string name="ltAgo">"منذ وقت طويل"</string>
<string name="Loaf">"رغيف"</string>
<string name="Litre">"لتر"</string>
<string name="listVM">"وضع عرض القائمة"</string>
<string name="Light">"فاتح"</string>
<string name="leaf">"leaf"</string>
<string name="lb">"lb"</string>
<string name="_Last_updated_Z2gEbLD">"Last updated"</string>
<string name="large">"كبير"</string>
<string name="lang">"اللغة"</string>
<string name="l">"ل"</string>
<string name="Korean">"كورية"</string>
<string name="Kilogram">"كيلوغرام"</string>
<string name="kg">"كغ"</string>
<string name="Kenyan">"كينية"</string>
<string name="kEdit">"KEEP EDITING"</string>
<string name="June">"يونيو"</string>
<string name="July">"يوليو"</string>
<string name="joinTG">"انضم لمجموعة التلغرام"</string>
<string name="Jewish">"يهودية"</string>
<string name="Japanese">"يابانية"</string>
<string name="January">"يناير"</string>
<string name="Jamaican">"جمايكية"</string>
<string name="Italian">"إيطالية"</string>
<string name="it">"Item"</string>
<string name="Irish">"إيرلندية"</string>
<string name="invFile">"ملف غير صحيح"</string>
<string name="intf">"الواجهة"</string>
<string name="inss">"Instructions"</string>
<string name="ings">"المكونات"</string>
<string name="Indian">"هندية"</string>
<string name="in">"إن"</string>
<string name="impSuc">"نجح الاستيراد"</string>
<string name="impip">"جار الاستيراد"</string>
<string name="impInfo">"يدعم النسخ الاحتياطية الكاملة المصدرة من هذا التطبيق"</string>
<string name="impFail">"فشل الاستيراد"</string>
<string name="impBu">"استورد البيانات"</string>
<string name="hr">"hr"</string>
<string name="Healthy">"صحية"</string>
<string name="guide">"دليل المستخدم"</string>
<string name="grocery">"قائمة التسوق"</string>
<string name="grid">"شبكة"</string>
<string name="Greek">"إغريقية"</string>
<string name="Gram">"غرام"</string>
<string name="gh">"اعرض على github"</string>
<string name="German">"ألمانية"</string>
<string name="Gallon">"جالون"</string>
<string name="gal">"جال"</string>
<string name="g">"غ"</string>
<string name="fsList">"وصفاتك المفضلة مسرودة هنا"</string>
<string name="FRI">"FRI"</string>
<string name="French">"فرنسية"</string>
<string name="_Fluid_Ounce_bd10L">"Fluid Ounce"</string>
<string name="fltr">"المصفاة"</string>
<string name="_fl_oz_72kqu">"fl oz"</string>
<string name="_Filtered_recipes_Z1alhhu">"الوصفات المصفاة"</string>
<string name="Filipino">"فلبينية"</string>
<string name="February">"فبراير"</string>
<string name="favourites">"المفضلات"</string>
<string name="expSuc">"نجح التصدير"</string>
<string name="expip">"جار التصدير"</string>
<string name="expBu">"صدر نسخة احتياطية كاملة"</string>
<string name="EnRecipes">""</string>
<string name="English">"إنجليزية"</string>
<string name="Egyptian">"مصرية"</string>
<string name="editRec">"عدل الوصفة"</string>
<string name="Easy">"سهلة"</string>
<string name="dsp">"dstspn"</string>
<string name="drop">"قطرة"</string>
<string name="dozen">"درزن"</string>
<string name="donate">"تبرع"</string>
<string name="disc">"هذه الوصفة فيها تغييرات غير محفوظة. ما الذي تريد فعله؟"</string>
<string name="disBtn">"استبعد"</string>
<string name="dinner">"عشاء"</string>
<string name="_Difficulty_level_cSL5d">"مستوى الصعوبة"</string>
<string name="detailed">"مفصل"</string>
<string name="Desserts">"حلا"</string>
<string name="delRecsInfo">"You are about to permanently delete %1$s"</string>
<string name="delRecInfo">"You are about to permanently delete the recipe %1$s"</string>
<string name="December">"ديسمبر"</string>
<string name="dBtn">"DELETE"</string>
<string name="db">"قاعدة البيانات"</string>
<string name="Dark">"داكن"</string>
<string name="Danish">"دنماركي"</string>
<string name="dAgo">"قبل %1$s أيام"</string>
<string name="Cup">"كأس"</string>
<string name="cup">"كأس"</string>
<string name="cui">"المطبخ"</string>
<string name="Created">"Created"</string>
<string name="cPic">"قص الصورة"</string>
<string name="cookT">"Cooking time"</string>
<string name="conf">"Confirm"</string>
<string name="conBtn">"أكمل"</string>
<string name="cmbs">"Combinations"</string>
<string name="cm">"سم"</string>
<string name="clove">"فص"</string>
<string name="Chinese">"صينية"</string>
<string name="Challenging">"صعبة"</string>
<string name="cBtn">"ألغ"</string>
<string name="cat">"الصنف"</string>
<string name="buMod">"لف النسخة الاحتياطة عدل في مكان آخر"</string>
<string name="buInfo">"يولد ملف ZIP يحتوي على جميع بياناتك يمكن استيراده مجدداً"</string>
<string name="buInc">"ملف نسخة احتياطي مشوه أو فاسد"</string>
<string name="buFol">"مجلد النسخ الاحتياطية"</string>
<string name="buEmp">"مجلد النسخ الاحتيطية فارغ"</string>
<string name="British">"بريطانية"</string>
<string name="breakfast">"فطور"</string>
<string name="Breads">"أخباز"</string>
<string name="Brazilian">"برازيلية"</string>
<string name="Black">"أسود"</string>
<string name="Beverages">"مشروبات"</string>
<string name="Barbecue">"شواء"</string>
<string name="August">"أغسطس"</string>
<string name="aStpBtn">"أضف خطوة"</string>
<string name="April">"أبريل"</string>
<string name="appRst">"إعادة تشغيل التطبيق متطلبة"</string>
<string name="apply">"طبق"</string>
<string name="appInfo">"EnRecipes is an open source, privacy-friendly digital cookbook that lets you create, manage and share your recipes"</string>
<string name="Appetizers">"مقبلات"</string>
<string name="appCrd">"Shared via EnRecipes. Get it on F-Droid, IzzyOnDroid or the Play Store."</string>
<string name="_app_name_1k3Sbz">""</string>
<string name="app_name">""</string>
<string name="title_activity_kimera">""</string>
<string name="aNoBtn">"أضف ملاحظة"</string>
<string name="aNBtn">"أضف جديدة"</string>
<string name="American">"أمريكية"</string>
<string name="allTs">"كل العلامات"</string>
<string name="allCuis">"كل المطابخ"</string>
<string name="allCats">"كل الأصناف"</string>
<string name="aIngBtn">"أضف مكون"</string>
<string name="aFBu">"أضف وصفة لتقوم بالنسخ الاحتياطي"</string>
<string name="addCmbBtn">"ADD COMBINATION"</string>
<string name="aD">"انتهى!"</string>
<string name="aBtn">"أضف"</string>
<string name="About">"حول"</string>
<string name="aap">"ألحق صورة"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -1,58 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="yld">""</string>
<string name="yieldU">""</string>
<string name="yieldQ">""</string>
<string name="yesterday">""</string>
<string name="sec">"s"</string>
<string name="WED">"DC."</string>
<string name="wAgo">""</string>
<string name="Vietnamese">""</string>
<string name="Vegetarian">"Vegetarianes"</string>
<string name="Vegan">"Veganes"</string>
<string name="untRec">"Recepta sense títol"</string>
<string name="unsaved">"Canvis no desats"</string>
<string name="Unit">""</string>
<string name="unit">""</string>
<string name="Undefined">"Sense definir"</string>
<string name="Turkish">""</string>
<string name="TUE">"DT."</string>
<string name="tsp">""</string>
<string name="tsInfo">""</string>
<string name="ts">"Etiquetes"</string>
<string name="trySer">""</string>
<string name="trylater">"Per a provar més tard"</string>
<string name="trnsl">"Tradueix"</string>
<string name="triedInfo">""</string>
<string name="today">""</string>
<string name="tLInfo">""</string>
<string name="title">""</string>
<string name="THU">"DJ."</string>
<string name="Theme">""</string>
<string name="Thai">""</string>
<string name="Teaspoon">"Culleradeta"</string>
<string name="tbsp">""</string>
<string name="Tablespoon">"Cullerada"</string>
<string name="sysDef">""</string>
<string name="swm">""</string>
<string name="Swedish">""</string>
<string name="sVwInfo">""</string>
<string name="sVw">""</string>
<string name="SUN">"DG."</string>
<string name="strAdd">""</string>
<string name="stp">""</string>
<string name="stick">""</string>
<string name="stars">""</string>
<string name="sru">""</string>
<string name="srt">""</string>
<string name="srpu">""</string>
<string name="_Sri_Lankan_Z7GfBa">""</string>
<string name="Spanish">"Espanyola"</string>
<string name="Soups">"Brous"</string>
<string name="snacks">"piscolabis"</string>
<string name="small">""</string>
<string name="sltd">""</string>
<string name="_Slowest_first_hHjY6">""</string>
<string name="simple">""</string>
<string name="_Side_dishes_Z1Et4Vg">"Guarnicions"</string>
<string name="shr">"Comparteix"</string>
<string name="Settings">"Paràmetres"</string>
@ -60,236 +25,294 @@
<string name="Serving">"Ració"</string>
<string name="ser">"Cerca"</string>
<string name="September">"setembre"</string>
<string name="selRec">""</string>
<string name="Seafood">"Peix i marisc"</string>
<string name="Scottish">""</string>
<string name="Sauces">"Salses"</string>
<string name="SAT">"DS."</string>
<string name="Salads">"Amanides"</string>
<string name="Russian">""</string>
<string name="rst">"REINICIA"</string>
<string name="rp">""</string>
<string name="Roll">""</string>
<string name="rmYUInfo">""</string>
<string name="rmUInfo">""</string>
<string name="rmN">""</string>
<string name="rmIns">""</string>
<string name="rmIng">""</string>
<string name="rmCuiInfo">""</string>
<string name="rmCmb">""</string>
<string name="rmCatInfo">""</string>
<string name="Rice">"Arròs"</string>
<string name="restYUL">""</string>
<string name="restUL">""</string>
<string name="restInfo">""</string>
<string name="restDone">""</string>
<string name="restCuiL">""</string>
<string name="restCatL">""</string>
<string name="rest">""</string>
<string name="resNF">""</string>
<string name="req">""</string>
<string name="recU">""</string>
<string name="recTitle">""</string>
<string name="recs">""</string>
<string name="recRm">""</string>
<string name="recPic">""</string>
<string name="recListEmp">""</string>
<string name="recI">""</string>
<string name="recF">""</string>
<string name="recE">""</string>
<string name="rec">"Recepta com a text"</string>
<string name="rBtn">""</string>
<string name="Rating">""</string>
<string name="_Quickest_first_Z1CpP7N">""</string>
<string name="qt">""</string>
<string name="pt">""</string>
<string name="priv">""</string>
<string name="prepT">""</string>
<string name="Pound">"Lliura"</string>
<string name="Poultry">""</string>
<string name="Portuguese">""</string>
<string name="plsAdd">""</string>
<string name="planner">"Planificador dàpats"</string>
<string name="pinch">""</string>
<string name="Piece">"Peça"</string>
<string name="piece">""</string>
<string name="pht">"Foto de la recepta"</string>
<string name="photogrid">""</string>
<string name="Patty">""</string>
<string name="Pasta">"Pasta"</string>
<string name="oz">""</string>
<string name="Ounce">"Unça"</string>
<string name="opts">""</string>
<string name="_Oldest_first_Z6cq4h">""</string>
<string name="OK">"Dacord"</string>
<string name="October">"octubre"</string>
<string name="nwYiU">""</string>
<string name="nwCat">"Categoria nova"</string>
<string name="November">"novembre"</string>
<string name="nos">""</string>
<string name="noRecs">""</string>
<string name="Noodles">"Fideus"</string>
<string name="noFavs">""</string>
<string name="noAccSensor">""</string>
<string name="no">""</string>
<string name="nNBtn">"ARA NO"</string>
<string name="nLangInfo">""</string>
<string name="Nigerian">""</string>
<string name="newUnit">""</string>
<string name="newRec">""</string>
<string name="_Newest_first_2Sb3c">""</string>
<string name="newCui">""</string>
<string name="MON">"DL."</string>
<string name="Moderate">""</string>
<string name="ml">""</string>
<string name="minimal">""</string>
<string name="min">""</string>
<string name="Millilitre">"Mil·lilitre"</string>
<string name="mg">""</string>
<string name="Mexican">"Mexicana"</string>
<string name="medium">""</string>
<string name="Meat">"Carn"</string>
<string name="May">"maig"</string>
<string name="March">"març"</string>
<string name="_Main_dishes_u6RGQ">""</string>
<string name="mAgo">""</string>
<string name="lunch">""</string>
<string name="ltAgo">""</string>
<string name="Loaf">""</string>
<string name="Litre">"Litre"</string>
<string name="listVM">""</string>
<string name="Light">""</string>
<string name="leaf">""</string>
<string name="lb">""</string>
<string name="_Last_updated_Z2gEbLD">""</string>
<string name="large">""</string>
<string name="lang">""</string>
<string name="l">""</string>
<string name="Korean">""</string>
<string name="Kilogram">"Quilogram"</string>
<string name="kg">""</string>
<string name="Kenyan">""</string>
<string name="kEdit">""</string>
<string name="June">"juny"</string>
<string name="July">"juliol"</string>
<string name="joinTG">""</string>
<string name="Jewish">""</string>
<string name="Japanese">""</string>
<string name="January">"gener"</string>
<string name="Jamaican">""</string>
<string name="Italian">""</string>
<string name="it">""</string>
<string name="Irish">""</string>
<string name="invFile">"El fitxer no és vàlid"</string>
<string name="intf">""</string>
<string name="inss">""</string>
<string name="ings">""</string>
<string name="Indian">""</string>
<string name="in">""</string>
<string name="impSuc">""</string>
<string name="impip">""</string>
<string name="impInfo">""</string>
<string name="impFail">"Ha fallat la importació"</string>
<string name="impBu">""</string>
<string name="hr">""</string>
<string name="Healthy">""</string>
<string name="guide">""</string>
<string name="grocery">"Llista de queviures"</string>
<string name="grid">"Graella"</string>
<string name="Greek">""</string>
<string name="Gram">"Gram"</string>
<string name="gh">""</string>
<string name="German">""</string>
<string name="Gallon">"Galó"</string>
<string name="gal">""</string>
<string name="g">""</string>
<string name="fsList">""</string>
<string name="FRI">"DV."</string>
<string name="French">""</string>
<string name="_Fluid_Ounce_bd10L">"Unça líquida"</string>
<string name="fltr">""</string>
<string name="_fl_oz_72kqu">""</string>
<string name="_Filtered_recipes_Z1alhhu">""</string>
<string name="Filipino">""</string>
<string name="February">"febrer"</string>
<string name="favourites">"Preferits"</string>
<string name="expSuc">""</string>
<string name="expip">""</string>
<string name="expBu">""</string>
<string name="EnRecipes">"EnRecipes"</string>
<string name="English">""</string>
<string name="Egyptian">""</string>
<string name="editRec">""</string>
<string name="Easy">""</string>
<string name="dsp">""</string>
<string name="drop">""</string>
<string name="dozen">""</string>
<string name="donate">""</string>
<string name="disc">"Aquesta recepta té canvis no desats. Què voleu fer?"</string>
<string name="disBtn">"DESCARTALS"</string>
<string name="dinner">""</string>
<string name="_Difficulty_level_cSL5d">""</string>
<string name="detailed">""</string>
<string name="Desserts">"Postres"</string>
<string name="delRecsInfo">""</string>
<string name="delRecInfo">""</string>
<string name="December">"desembre"</string>
<string name="dBtn">"SUPRIMEIX"</string>
<string name="db">""</string>
<string name="Dark">""</string>
<string name="Danish">""</string>
<string name="dAgo">""</string>
<string name="Cup">"Tassa"</string>
<string name="cup">""</string>
<string name="cui">""</string>
<string name="Created">""</string>
<string name="cPic">"Escapça la foto"</string>
<string name="cookT">""</string>
<string name="conf">"Confirma"</string>
<string name="conBtn">"CONTINUA"</string>
<string name="cmbs">""</string>
<string name="cm">""</string>
<string name="clove">""</string>
<string name="Chinese">""</string>
<string name="Challenging">""</string>
<string name="cBtn">""</string>
<string name="cat">""</string>
<string name="buMod">""</string>
<string name="buInfo">""</string>
<string name="buInc">""</string>
<string name="buFol">""</string>
<string name="buEmp">""</string>
<string name="British">""</string>
<string name="breakfast">""</string>
<string name="Breads">"Pans"</string>
<string name="Brazilian">""</string>
<string name="Black">""</string>
<string name="Beverages">"Begudes"</string>
<string name="Barbecue">"Barbacoes"</string>
<string name="August">"agost"</string>
<string name="aStpBtn">""</string>
<string name="April">"abril"</string>
<string name="appRst">"Cal reiniciar laplicació"</string>
<string name="apply">""</string>
<string name="appInfo">"LEnRecipes és un receptari digital, de codi obert i privat, que us permet crear, gestionar i compartir les vostres receptes"</string>
<string name="Appetizers">"Aperitius"</string>
<string name="appCrd">""</string>
<string name="_app_name_1k3Sbz">"EnRecipes"</string>
<string name="app_name">"EnRecipes"</string>
<string name="title_activity_kimera">"EnRecipes"</string>
<string name="aNoBtn">""</string>
<string name="aNBtn">"AFEGEIX-NE UN DE NOU"</string>
<string name="American">""</string>
<string name="allTs">"Totes les etiquetes"</string>
<string name="allCuis">""</string>
<string name="allCats">"Totes les categories"</string>
<string name="aIngBtn">""</string>
<string name="aFBu">""</string>
<string name="addCmbBtn">""</string>
<string name="aD">""</string>
<string name="aBtn">""</string>
<string name="About">"Quant a"</string>
<string name="aap">""</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
<string name="seconds">"seconds"</string>
<string name="hours">"hours"</string>
<string name="hour">"hour"</string>
<string name="minutes">"minutes"</string>
<string name="minute">"minute"</string>
<string name="dlyDur">"Delay duration"</string>
<string name="tmrvbrt">"Timer vibrate"</string>
<string name="tmrSnd">"Timer sound"</string>
<string name="aTPrst">"Added to presets"</string>
<string name="fwr">"for which recipe?"</string>
<string name="tmrPrsts">"Timer presets"</string>
<string name="prstBtn">"PRESETS"</string>
<string name="tmr">"Timer %1$s"</string>
<string name="delay">"Delay"</string>
<string name="stop">"Stop"</string>
<string name="strtBtn">"START"</string>
<string name="ntmr">"New timer"</string>
<string name="timer">"Cooking Timer"</string>
<string name="sysDefB">"System default + Black"</string>
<string name="buto">"Backed up to %1$s"</string>
<string name="yld">"Yield"</string>
<string name="yieldU">"Yield unit"</string>
<string name="yieldQ">"Yield quantity"</string>
<string name="yesterday">"yesterday"</string>
<string name="wAgo">"%1$s weeks ago"</string>
<string name="Vietnamese">"Vietnamese"</string>
<string name="Unit">"Unit"</string>
<string name="unit">"unit"</string>
<string name="Turkish">"Turkish"</string>
<string name="tsp">"tsp"</string>
<string name="tsInfo">"separate with spaces"</string>
<string name="trySer">"SEARCH IN ALL THE RECIPES?"</string>
<string name="triedInfo">"You tried this recipe %1$s"</string>
<string name="today">"today"</string>
<string name="tLInfo">"Recipes you want to try later are listed here"</string>
<string name="title">"Title"</string>
<string name="Theme">"Theme"</string>
<string name="Thai">"Thai"</string>
<string name="tbsp">"tbsp"</string>
<string name="sysDef">"System default"</string>
<string name="swm">"Start week on Monday"</string>
<string name="Swedish">"Swedish"</string>
<string name="sVwInfo">"Helps you choose what to cook when you can\'t decide"</string>
<string name="sVw">"Shake to view random recipe"</string>
<string name="strAdd">"Start adding your recipes!"</string>
<string name="stp">"Step"</string>
<string name="stick">"stick"</string>
<string name="stars">"Star rating"</string>
<string name="sru">"Share recipe using..."</string>
<string name="srt">"Sort"</string>
<string name="srpu">"Share recipe photo using..."</string>
<string name="_Sri_Lankan_Z7GfBa">"Sri Lankan"</string>
<string name="small">"small"</string>
<string name="sltd">"selected"</string>
<string name="_Slowest_first_hHjY6">"Slowest first"</string>
<string name="simple">"Simple"</string>
<string name="selRec">"Select recipe"</string>
<string name="Scottish">"Scottish"</string>
<string name="Russian">"Russian"</string>
<string name="rp">"Remove photo"</string>
<string name="Roll">"Roll"</string>
<string name="rmYUInfo">"You are about to remove %1$s from the yield unit list"</string>
<string name="rmUInfo">"You are about to remove %1$s from the unit list"</string>
<string name="rmN">"Note removed"</string>
<string name="rmIns">"Instruction removed"</string>
<string name="rmIng">"Ingredient removed"</string>
<string name="rmCuiInfo">"You are about to remove %1$s from the cuisine list"</string>
<string name="rmCmb">"Combination removed"</string>
<string name="rmCatInfo">"You are about to remove %1$s from the category list"</string>
<string name="restYUL">"Reset yield unit list"</string>
<string name="restUL">"Reset unit list"</string>
<string name="restInfo">"Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."</string>
<string name="restDone">"Reset done"</string>
<string name="restCuiL">"Reset cuisine list"</string>
<string name="restCatL">"Reset category list"</string>
<string name="rest">"Reset"</string>
<string name="resNF">"Recipe not found"</string>
<string name="req">"Required %1$s"</string>
<string name="recU">"Updated:"</string>
<string name="recTitle">"My Healthy Recipe"</string>
<string name="recs">"recipes"</string>
<string name="recRm">"Recipe removed"</string>
<string name="recPic">"Recipe photo"</string>
<string name="recListEmp">"Nothing here! Add some recipes and try again"</string>
<string name="recI">"Imported:"</string>
<string name="recF">"recipes found"</string>
<string name="recE">"Already exist:"</string>
<string name="rBtn">"REMOVE"</string>
<string name="Rating">"Rating"</string>
<string name="_Quickest_first_Z1CpP7N">"Quickest first"</string>
<string name="qt">"qt"</string>
<string name="pt">"pt"</string>
<string name="priv">"Privacy policy"</string>
<string name="prepT">"Preparation time"</string>
<string name="Poultry">"Poultry"</string>
<string name="Portuguese">"Portuguese"</string>
<string name="plsAdd">"Use the plus button to add one"</string>
<string name="pinch">"pinch"</string>
<string name="piece">"piece"</string>
<string name="photogrid">"Photo Grid"</string>
<string name="Patty">"Patty"</string>
<string name="oz">"oz"</string>
<string name="opts">"Options"</string>
<string name="_Oldest_first_Z6cq4h">"Oldest first"</string>
<string name="nwYiU">"New yield unit"</string>
<string name="nos">"Notes"</string>
<string name="noRecsInL">"None of the recipes here matches your search"</string>
<string name="noRecs">"No recipes match your search"</string>
<string name="noFavs">"No favourites yet"</string>
<string name="noAccSensor">"Accelerometer sensor is either disabled or is not working"</string>
<string name="no">"Note"</string>
<string name="nLangInfo">"Restart EnRecipes to use the new language"</string>
<string name="Nigerian">"Nigerian"</string>
<string name="newUnit">"New unit"</string>
<string name="newRec">"New recipe"</string>
<string name="_Newest_first_2Sb3c">"Newest first"</string>
<string name="newCui">"New cuisine"</string>
<string name="Moderate">"Moderate"</string>
<string name="ml">"ml"</string>
<string name="minimal">"Minimal"</string>
<string name="min">"min"</string>
<string name="mg">"mg"</string>
<string name="medium">"medium"</string>
<string name="_Main_dishes_u6RGQ">"Main dishes"</string>
<string name="mAgo">"%1$s months ago"</string>
<string name="lunch">"Lunch"</string>
<string name="ltAgo">"a long time ago"</string>
<string name="Loaf">"Loaf"</string>
<string name="listVM">"List view mode"</string>
<string name="Light">"Light"</string>
<string name="leaf">"leaf"</string>
<string name="lb">"lb"</string>
<string name="_Last_updated_Z2gEbLD">"Last updated"</string>
<string name="large">"large"</string>
<string name="lang">"Language"</string>
<string name="l">"l"</string>
<string name="Korean">"Korean"</string>
<string name="kg">"kg"</string>
<string name="Kenyan">"Kenyan"</string>
<string name="kEdit">"KEEP EDITING"</string>
<string name="joinTG">"Join the Telegram group"</string>
<string name="Jewish">"Jewish"</string>
<string name="Japanese">"Japanese"</string>
<string name="Jamaican">"Jamaican"</string>
<string name="Italian">"Italian"</string>
<string name="it">"Item"</string>
<string name="Irish">"Irish"</string>
<string name="intf">"Interface"</string>
<string name="inss">"Instructions"</string>
<string name="ings">"Ingredients"</string>
<string name="Indian">"Indian"</string>
<string name="in">"in"</string>
<string name="impSuc">"Import success"</string>
<string name="impip">"Import in progress"</string>
<string name="impInfo">"Supports full backups exported by this app"</string>
<string name="impBu">"Import data"</string>
<string name="hr">"hr"</string>
<string name="Healthy">"Healthy"</string>
<string name="guide">"User guide"</string>
<string name="Greek">"Greek"</string>
<string name="gh">"View on GitHub"</string>
<string name="German">"German"</string>
<string name="gal">"gal"</string>
<string name="g">"g"</string>
<string name="fsList">"Your favourite recipes are listed here"</string>
<string name="French">"French"</string>
<string name="fltr">"Filter"</string>
<string name="_fl_oz_72kqu">"fl oz"</string>
<string name="_Filtered_recipes_Z1alhhu">"Filtered recipes"</string>
<string name="Filipino">"Filipino"</string>
<string name="expSuc">"Export success"</string>
<string name="expip">"Export in progress"</string>
<string name="expBu">"Export full backup"</string>
<string name="English">"English"</string>
<string name="Egyptian">"Egyptian"</string>
<string name="editRec">"Edit recipe"</string>
<string name="Easy">"Easy"</string>
<string name="dsp">"dstspn"</string>
<string name="drop">"drop"</string>
<string name="dozen">"dozen"</string>
<string name="donate">"Donate"</string>
<string name="dinner">"Dinner"</string>
<string name="_Difficulty_level_cSL5d">"Difficulty level"</string>
<string name="detailed">"Detailed"</string>
<string name="delRecsInfo">"You are about to permanently delete %1$s"</string>
<string name="delRecInfo">"You are about to permanently delete the recipe %1$s"</string>
<string name="db">"Database"</string>
<string name="Dark">"Dark"</string>
<string name="Danish">"Danish"</string>
<string name="dAgo">"%1$s days ago"</string>
<string name="cup">"cup"</string>
<string name="cui">"Cuisine"</string>
<string name="Created">"Created"</string>
<string name="cookT">"Cooking time"</string>
<string name="cmbs">"Combinations"</string>
<string name="cm">"cm"</string>
<string name="clove">"clove"</string>
<string name="Chinese">"Chinese"</string>
<string name="Challenging">"Challenging"</string>
<string name="cBtn">"CANCEL"</string>
<string name="cat">"Category"</string>
<string name="buMod">"The backup file was modified elsewhere"</string>
<string name="buInfo">"Generates a ZIP file containing all your data that can be imported back"</string>
<string name="buInc">"Malformed or corrupt backup file"</string>
<string name="buFol">"Backup folder"</string>
<string name="buEmp">"The backup file is empty"</string>
<string name="British">"British"</string>
<string name="breakfast">"Breakfast"</string>
<string name="Brazilian">"Brazilian"</string>
<string name="Black">"Black"</string>
<string name="aStpBtn">"ADD STEP"</string>
<string name="apply">"APPLY"</string>
<string name="appCrd">"Shared via EnRecipes. Get it on F-Droid, IzzyOnDroid or the Play Store."</string>
<string name="aNoBtn">"ADD NOTE"</string>
<string name="American">"American"</string>
<string name="allCuis">"All Cuisines"</string>
<string name="aIngBtn">"ADD INGREDIENT"</string>
<string name="aFBu">"Add a recipe to perform a backup"</string>
<string name="addCmbBtn">"ADD COMBINATION"</string>
<string name="aD">"All done!"</string>
<string name="aBtn">"ADD"</string>
<string name="aap">"Attach a photo"</string>
<string name="tmrClr">"tmrClr"</string>
</resources>

View file

@ -1,5 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="seconds">"sekunder"</string>
<string name="minutes">"minutter"</string>
<string name="minute">"minut"</string>
<string name="dlyDur">"Forsinkelsens varighed"</string>
<string name="tmrvbrt">"Timer vibrerer"</string>
<string name="tmr">"Timeren %1$s"</string>
<string name="tmrSnd">"Timeren lyd"</string>
<string name="prstBtn">"FORUDSÆTTER"</string>
<string name="tmrPrsts">"Timeren forindstillinger"</string>
<string name="fwr">"til hvilken opskrift?"</string>
<string name="aTPrst">"Tilføjet til forudindstillinger"</string>
<string name="hours">"timers"</string>
<string name="hour">"timer"</string>
<string name="tmrClr">"Timeren er slettet"</string>
<string name="timer">"Kogetid Timer"</string>
<string name="ntmr">"Ny timer"</string>
<string name="strtBtn">"STARTER"</string>
<string name="stop">"Stopper"</string>
<string name="delay">"Forsinkelse"</string>
<string name="sec">"s"</string>
<string name="sysDefB">"Systemstandard + sort"</string>
<string name="November">"November"</string>
<string name="nwCat">"Ny kategori"</string>
<string name="nwYiU">"Ny udbytteenhed"</string>
@ -292,4 +313,6 @@
<string name="American">"American"</string>
<string name="aD">"Fuldendt!"</string>
<string name="About">"Om"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -1,5 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tmrClr">"Timer gelöscht"</string>
<string name="delay">"Verzögerung"</string>
<string name="dlyDur">"Verzögerungsdauer"</string>
<string name="minute">"Minute"</string>
<string name="minutes">"Minuten"</string>
<string name="hour">"Stunde"</string>
<string name="hours">"Stunden"</string>
<string name="seconds">"Sekunden"</string>
<string name="stop">"Stopp"</string>
<string name="prstBtn">"Voreinstellungen"</string>
<string name="fwr">"für welches Rezept?"</string>
<string name="aTPrst">"Zu Voreinstellungen hinzugefügt"</string>
<string name="tmrPrsts">"Timer-Voreinstellungen"</string>
<string name="tmrSnd">"Timerton"</string>
<string name="tmrvbrt">"Timervibration"</string>
<string name="sec">"sec"</string>
<string name="timer">"Kochtimer"</string>
<string name="ntmr">"Neuer Timer"</string>
<string name="strtBtn">"START"</string>
<string name="tmr">"Timer %1$s"</string>
<string name="sysDefB">"Systemstandard + schwarz"</string>
<string name="buto">"Gesichert in %1$s"</string>
<string name="yld">"Ergebnis"</string>
<string name="yieldU">"Ertragseinheit"</string>
@ -292,4 +313,6 @@
<string name="aBtn">"HINZUFÜGEN"</string>
<string name="About">"Über"</string>
<string name="aap">"Foto anhängen"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -0,0 +1,318 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tmrClr">"Timer cleared"</string>
<string name="delay">"Delay"</string>
<string name="dlyDur">"Delay duration"</string>
<string name="minute">"minute"</string>
<string name="minutes">"minutes"</string>
<string name="hour">"hour"</string>
<string name="hours">"hours"</string>
<string name="seconds">"seconds"</string>
<string name="sec">"s"</string>
<string name="timer">"Cooking Timer"</string>
<string name="ntmr">"New timer"</string>
<string name="strtBtn">"START"</string>
<string name="stop">"Stop"</string>
<string name="tmr">"Timer %1$s"</string>
<string name="prstBtn">"PRESETS"</string>
<string name="tmrPrsts">"Timer presets"</string>
<string name="fwr">"for which recipe?"</string>
<string name="aTPrst">"Added to presets"</string>
<string name="tmrSnd">"Timer sound"</string>
<string name="tmrvbrt">"Timer vibrate"</string>
<string name="sysDefB">"System default + Black"</string>
<string name="buto">"Backed up to %1$s"</string>
<string name="yld">"Yield"</string>
<string name="yieldU">"Yield unit"</string>
<string name="yieldQ">"Yield quantity"</string>
<string name="yesterday">"yesterday"</string>
<string name="WED">"WED"</string>
<string name="wAgo">"%1$s weeks ago"</string>
<string name="Vietnamese">"Vietnamese"</string>
<string name="Vegetarian">"Vegetarian"</string>
<string name="Vegan">"Vegan"</string>
<string name="untRec">"Untitled Recipe"</string>
<string name="unsaved">"Unsaved changes"</string>
<string name="Unit">"Unit"</string>
<string name="unit">"unit"</string>
<string name="Undefined">"Undefined"</string>
<string name="Turkish">"Turkish"</string>
<string name="TUE">"TUE"</string>
<string name="tsp">"tsp"</string>
<string name="tsInfo">"separate with spaces"</string>
<string name="ts">"Tags"</string>
<string name="trySer">"SEARCH IN ALL THE RECIPES?"</string>
<string name="trylater">"Try Later"</string>
<string name="trnsl">"Translate"</string>
<string name="triedInfo">"You tried this recipe %1$s"</string>
<string name="today">"today"</string>
<string name="tLInfo">"Recipes you want to try later are listed here"</string>
<string name="title">"Title"</string>
<string name="THU">"THU"</string>
<string name="Theme">"Theme"</string>
<string name="Thai">"Thai"</string>
<string name="Teaspoon">"Teaspoon"</string>
<string name="tbsp">"tbsp"</string>
<string name="Tablespoon">"Tablespoon"</string>
<string name="sysDef">"System default"</string>
<string name="swm">"Start week on Monday"</string>
<string name="Swedish">"Swedish"</string>
<string name="sVwInfo">"Helps you choose what to cook when you can\'t decide"</string>
<string name="sVw">"Shake to view random recipe"</string>
<string name="SUN">"SUN"</string>
<string name="strAdd">"Start adding your recipes!"</string>
<string name="stp">"Step"</string>
<string name="stick">"stick"</string>
<string name="stars">"Star rating"</string>
<string name="sru">"Share recipe using..."</string>
<string name="srt">"Sort"</string>
<string name="srpu">"Share recipe photo using..."</string>
<string name="_Sri_Lankan_Z7GfBa">"Sri Lankan"</string>
<string name="Spanish">"Spanish"</string>
<string name="Soups">"Soups"</string>
<string name="snacks">"Snacks"</string>
<string name="small">"small"</string>
<string name="sltd">"selected"</string>
<string name="_Slowest_first_hHjY6">"Slowest first"</string>
<string name="simple">"Simple"</string>
<string name="_Side_dishes_Z1Et4Vg">"Side dishes"</string>
<string name="shr">"Share"</string>
<string name="Settings">"Settings"</string>
<string name="SET">"SET"</string>
<string name="Serving">"Serving"</string>
<string name="ser">"Search"</string>
<string name="September">"September"</string>
<string name="selRec">"Select recipe"</string>
<string name="Seafood">"Seafood"</string>
<string name="Scottish">"Scottish"</string>
<string name="Sauces">"Sauces"</string>
<string name="SAT">"SAT"</string>
<string name="Salads">"Salads"</string>
<string name="Russian">"Russian"</string>
<string name="rst">"RESTART"</string>
<string name="rp">"Remove photo"</string>
<string name="Roll">"Roll"</string>
<string name="rmYUInfo">"You are about to remove %1$s from the yield unit list"</string>
<string name="rmUInfo">"You are about to remove %1$s from the unit list"</string>
<string name="rmN">"Note removed"</string>
<string name="rmIns">"Instruction removed"</string>
<string name="rmIng">"Ingredient removed"</string>
<string name="rmCuiInfo">"You are about to remove %1$s from the cuisine list"</string>
<string name="rmCmb">"Combination removed"</string>
<string name="rmCatInfo">"You are about to remove %1$s from the category list"</string>
<string name="Rice">"Rice"</string>
<string name="restYUL">"Reset yield unit list"</string>
<string name="restUL">"Reset unit list"</string>
<string name="restInfo">"Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."</string>
<string name="restDone">"Reset done"</string>
<string name="restCuiL">"Reset cuisine list"</string>
<string name="restCatL">"Reset category list"</string>
<string name="rest">"Reset"</string>
<string name="resNF">"Recipe not found"</string>
<string name="req">"Required %1$s"</string>
<string name="recU">"Updated:"</string>
<string name="recTitle">"My Healthy Recipe"</string>
<string name="recs">"recipes"</string>
<string name="recRm">"Recipe removed"</string>
<string name="recPic">"Recipe photo"</string>
<string name="recListEmp">"Nothing here! Add some recipes and try again"</string>
<string name="recI">"Imported:"</string>
<string name="recF">"recipes found"</string>
<string name="recE">"Already exist:"</string>
<string name="rec">"Recipe"</string>
<string name="rBtn">"REMOVE"</string>
<string name="Rating">"Rating"</string>
<string name="_Quickest_first_Z1CpP7N">"Quickest first"</string>
<string name="qt">"qt"</string>
<string name="pt">"pt"</string>
<string name="priv">"Privacy policy"</string>
<string name="prepT">"Preparation time"</string>
<string name="Pound">"Pound"</string>
<string name="Poultry">"Poultry"</string>
<string name="Portuguese">"Portuguese"</string>
<string name="plsAdd">"Use the plus button to add one"</string>
<string name="planner">"Meal Planner"</string>
<string name="pinch">"pinch"</string>
<string name="Piece">"Piece"</string>
<string name="piece">"piece"</string>
<string name="pht">"Recipe photo"</string>
<string name="photogrid">"Photo Grid"</string>
<string name="Patty">"Patty"</string>
<string name="Pasta">"Pasta"</string>
<string name="oz">"oz"</string>
<string name="Ounce">"Ounce"</string>
<string name="opts">"Options"</string>
<string name="_Oldest_first_Z6cq4h">"Oldest first"</string>
<string name="OK">"OK"</string>
<string name="October">"October"</string>
<string name="nwYiU">"New yield unit"</string>
<string name="nwCat">"New category"</string>
<string name="November">"November"</string>
<string name="nos">"Notes"</string>
<string name="noRecsInL">"None of the recipes here matches your search"</string>
<string name="noRecs">"No recipes match your search"</string>
<string name="Noodles">"Noodles"</string>
<string name="noFavs">"No favourites yet"</string>
<string name="noAccSensor">"Accelerometer sensor is either disabled or is not working"</string>
<string name="no">"Note"</string>
<string name="nNBtn">"NOT NOW"</string>
<string name="nLangInfo">"Restart EnRecipes to use the new language"</string>
<string name="Nigerian">"Nigerian"</string>
<string name="newUnit">"New unit"</string>
<string name="newRec">"New recipe"</string>
<string name="_Newest_first_2Sb3c">"Newest first"</string>
<string name="newCui">"New cuisine"</string>
<string name="MON">"MON"</string>
<string name="Moderate">"Moderate"</string>
<string name="ml">"ml"</string>
<string name="minimal">"Minimal"</string>
<string name="min">"min"</string>
<string name="Millilitre">"Millilitre"</string>
<string name="mg">"mg"</string>
<string name="Mexican">"Mexican"</string>
<string name="medium">"medium"</string>
<string name="Meat">"Meat"</string>
<string name="May">"May"</string>
<string name="March">"March"</string>
<string name="_Main_dishes_u6RGQ">"Main dishes"</string>
<string name="mAgo">"%1$s months ago"</string>
<string name="lunch">"Lunch"</string>
<string name="ltAgo">"a long time ago"</string>
<string name="Loaf">"Loaf"</string>
<string name="Litre">"Litre"</string>
<string name="listVM">"List view mode"</string>
<string name="Light">"Light"</string>
<string name="leaf">"leaf"</string>
<string name="lb">"lb"</string>
<string name="_Last_updated_Z2gEbLD">"Last updated"</string>
<string name="large">"large"</string>
<string name="lang">"Language"</string>
<string name="l">"l"</string>
<string name="Korean">"Korean"</string>
<string name="Kilogram">"Kilogram"</string>
<string name="kg">"kg"</string>
<string name="Kenyan">"Kenyan"</string>
<string name="kEdit">"KEEP EDITING"</string>
<string name="June">"June"</string>
<string name="July">"July"</string>
<string name="joinTG">"Join the Telegram group"</string>
<string name="Jewish">"Jewish"</string>
<string name="Japanese">"Japanese"</string>
<string name="January">"January"</string>
<string name="Jamaican">"Jamaican"</string>
<string name="Italian">"Italian"</string>
<string name="it">"Item"</string>
<string name="Irish">"Irish"</string>
<string name="invFile">"Invalid file"</string>
<string name="intf">"Interface"</string>
<string name="inss">"Instructions"</string>
<string name="ings">"Ingredients"</string>
<string name="Indian">"Indian"</string>
<string name="in">"in"</string>
<string name="impSuc">"Import success"</string>
<string name="impip">"Import in progress"</string>
<string name="impInfo">"Supports full backups exported by this app"</string>
<string name="impFail">"Import failed"</string>
<string name="impBu">"Import data"</string>
<string name="hr">"h"</string>
<string name="Healthy">"Healthy"</string>
<string name="guide">"User guide"</string>
<string name="grocery">"Grocery List"</string>
<string name="grid">"Grid"</string>
<string name="Greek">"Greek"</string>
<string name="Gram">"Gram"</string>
<string name="gh">"View on GitHub"</string>
<string name="German">"German"</string>
<string name="Gallon">"Gallon"</string>
<string name="gal">"gal"</string>
<string name="g">"g"</string>
<string name="fsList">"Your favourite recipes are listed here"</string>
<string name="FRI">"FRI"</string>
<string name="French">"French"</string>
<string name="_Fluid_Ounce_bd10L">"Fluid Ounce"</string>
<string name="fltr">"Filter"</string>
<string name="_fl_oz_72kqu">"fl oz"</string>
<string name="_Filtered_recipes_Z1alhhu">"Filtered recipes"</string>
<string name="Filipino">"Filipino"</string>
<string name="February">"February"</string>
<string name="favourites">"Favourites"</string>
<string name="expSuc">"Export success"</string>
<string name="expip">"Export in progress"</string>
<string name="expBu">"Export full backup"</string>
<string name="EnRecipes">"EnRecipes"</string>
<string name="English">"English"</string>
<string name="Egyptian">"Egyptian"</string>
<string name="editRec">"Edit recipe"</string>
<string name="Easy">"Easy"</string>
<string name="dsp">"dstspn"</string>
<string name="drop">"drop"</string>
<string name="dozen">"dozen"</string>
<string name="donate">"Donate"</string>
<string name="disc">"This recipe has unsaved changes. What would you like to do?"</string>
<string name="disBtn">"DISCARD"</string>
<string name="dinner">"Dinner"</string>
<string name="_Difficulty_level_cSL5d">"Difficulty level"</string>
<string name="detailed">"Detailed"</string>
<string name="Desserts">"Desserts"</string>
<string name="delRecsInfo">"You are about to permanently delete %1$s"</string>
<string name="delRecInfo">"You are about to permanently delete the recipe %1$s"</string>
<string name="December">"December"</string>
<string name="dBtn">"DELETE"</string>
<string name="db">"Database"</string>
<string name="Dark">"Dark"</string>
<string name="Danish">"Danish"</string>
<string name="dAgo">"%1$s days ago"</string>
<string name="Cup">"Cup"</string>
<string name="cup">"cup"</string>
<string name="cui">"Cuisine"</string>
<string name="Created">"Created"</string>
<string name="cPic">"Crop photo"</string>
<string name="cookT">"Cooking time"</string>
<string name="conf">"Confirm"</string>
<string name="conBtn">"CONTINUE"</string>
<string name="cmbs">"Combinations"</string>
<string name="cm">"cm"</string>
<string name="clove">"clove"</string>
<string name="Chinese">"Chinese"</string>
<string name="Challenging">"Challenging"</string>
<string name="cBtn">"CANCEL"</string>
<string name="cat">"Category"</string>
<string name="buMod">"The backup file was modified elsewhere"</string>
<string name="buInfo">"Generates a ZIP file containing all your data that can be imported back"</string>
<string name="buInc">"Malformed or corrupt backup file"</string>
<string name="buFol">"Backup folder"</string>
<string name="buEmp">"The backup file is empty"</string>
<string name="British">"British"</string>
<string name="breakfast">"Breakfast"</string>
<string name="Breads">"Breads"</string>
<string name="Brazilian">"Brazilian"</string>
<string name="Black">"Black"</string>
<string name="Beverages">"Beverages"</string>
<string name="Barbecue">"Barbecue"</string>
<string name="August">"August"</string>
<string name="aStpBtn">"ADD STEP"</string>
<string name="April">"April"</string>
<string name="appRst">"App restart required"</string>
<string name="apply">"APPLY"</string>
<string name="appInfo">"EnRecipes is an open source, privacy-friendly digital cookbook that lets you create, manage and share your recipes"</string>
<string name="Appetizers">"Appetizers"</string>
<string name="appCrd">"Shared via EnRecipes. Get it on F-Droid, IzzyOnDroid or the Play Store."</string>
<string name="_app_name_1k3Sbz">"EnRecipes"</string>
<string name="app_name">"EnRecipes"</string>
<string name="title_activity_kimera">"EnRecipes"</string>
<string name="aNoBtn">"ADD NOTE"</string>
<string name="aNBtn">"ADD NEW"</string>
<string name="American">"American"</string>
<string name="allTs">"All Tags"</string>
<string name="allCuis">"All Cuisines"</string>
<string name="allCats">"All Categories"</string>
<string name="aIngBtn">"ADD INGREDIENT"</string>
<string name="aFBu">"Add a recipe to perform a backup"</string>
<string name="addCmbBtn">"ADD COMBINATION"</string>
<string name="aD">"All done!"</string>
<string name="aBtn">"ADD"</string>
<string name="About">"About"</string>
<string name="aap">"Attach a photo"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -0,0 +1,318 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tmrClr">"Timer cleared"</string>
<string name="delay">"Delay"</string>
<string name="dlyDur">"Delay duration"</string>
<string name="minute">"minute"</string>
<string name="minutes">"minutes"</string>
<string name="hour">"hour"</string>
<string name="hours">"hours"</string>
<string name="seconds">"seconds"</string>
<string name="sec">"s"</string>
<string name="timer">"Cooking Timer"</string>
<string name="ntmr">"New timer"</string>
<string name="strtBtn">"START"</string>
<string name="stop">"Stop"</string>
<string name="tmr">"Timer %1$s"</string>
<string name="prstBtn">"PRESETS"</string>
<string name="tmrPrsts">"Timer presets"</string>
<string name="fwr">"for which recipe?"</string>
<string name="aTPrst">"Added to presets"</string>
<string name="tmrSnd">"Timer sound"</string>
<string name="tmrvbrt">"Timer vibrate"</string>
<string name="sysDefB">"System default + Black"</string>
<string name="buto">"Backed up to %1$s"</string>
<string name="yld">"Yield"</string>
<string name="yieldU">"Yield unit"</string>
<string name="yieldQ">"Yield quantity"</string>
<string name="yesterday">"yesterday"</string>
<string name="WED">"WED"</string>
<string name="wAgo">"%1$s weeks ago"</string>
<string name="Vietnamese">"Vietnamese"</string>
<string name="Vegetarian">"Vegetarian"</string>
<string name="Vegan">"Vegan"</string>
<string name="untRec">"Untitled Recipe"</string>
<string name="unsaved">"Unsaved changes"</string>
<string name="Unit">"Unit"</string>
<string name="unit">"unit"</string>
<string name="Undefined">"Undefined"</string>
<string name="Turkish">"Turkish"</string>
<string name="TUE">"TUE"</string>
<string name="tsp">"tsp"</string>
<string name="tsInfo">"separate with spaces"</string>
<string name="ts">"Tags"</string>
<string name="trySer">"SEARCH IN ALL THE RECIPES?"</string>
<string name="trylater">"Try Later"</string>
<string name="trnsl">"Translate"</string>
<string name="triedInfo">"You tried this recipe %1$s"</string>
<string name="today">"today"</string>
<string name="tLInfo">"Recipes you want to try later are listed here"</string>
<string name="title">"Title"</string>
<string name="THU">"THU"</string>
<string name="Theme">"Theme"</string>
<string name="Thai">"Thai"</string>
<string name="Teaspoon">"Teaspoon"</string>
<string name="tbsp">"tbsp"</string>
<string name="Tablespoon">"Tablespoon"</string>
<string name="sysDef">"System default"</string>
<string name="swm">"Start week on Monday"</string>
<string name="Swedish">"Swedish"</string>
<string name="sVwInfo">"Helps you choose what to cook when you can\'t decide"</string>
<string name="sVw">"Shake to view random recipe"</string>
<string name="SUN">"SUN"</string>
<string name="strAdd">"Start adding your recipes!"</string>
<string name="stp">"Step"</string>
<string name="stick">"stick"</string>
<string name="stars">"Star rating"</string>
<string name="sru">"Share recipe using..."</string>
<string name="srt">"Sort"</string>
<string name="srpu">"Share recipe photo using..."</string>
<string name="_Sri_Lankan_Z7GfBa">"Sri Lankan"</string>
<string name="Spanish">"Spanish"</string>
<string name="Soups">"Soups"</string>
<string name="snacks">"Snacks"</string>
<string name="small">"small"</string>
<string name="sltd">"selected"</string>
<string name="_Slowest_first_hHjY6">"Slowest first"</string>
<string name="simple">"Simple"</string>
<string name="_Side_dishes_Z1Et4Vg">"Side dishes"</string>
<string name="shr">"Share"</string>
<string name="Settings">"Settings"</string>
<string name="SET">"SET"</string>
<string name="Serving">"Serving"</string>
<string name="ser">"Search"</string>
<string name="September">"September"</string>
<string name="selRec">"Select recipe"</string>
<string name="Seafood">"Seafood"</string>
<string name="Scottish">"Scottish"</string>
<string name="Sauces">"Sauces"</string>
<string name="SAT">"SAT"</string>
<string name="Salads">"Salads"</string>
<string name="Russian">"Russian"</string>
<string name="rst">"RESTART"</string>
<string name="rp">"Remove photo"</string>
<string name="Roll">"Roll"</string>
<string name="rmYUInfo">"You are about to remove %1$s from the yield unit list"</string>
<string name="rmUInfo">"You are about to remove %1$s from the unit list"</string>
<string name="rmN">"Note removed"</string>
<string name="rmIns">"Instruction removed"</string>
<string name="rmIng">"Ingredient removed"</string>
<string name="rmCuiInfo">"You are about to remove %1$s from the cuisine list"</string>
<string name="rmCmb">"Combination removed"</string>
<string name="rmCatInfo">"You are about to remove %1$s from the category list"</string>
<string name="Rice">"Rice"</string>
<string name="restYUL">"Reset yield unit list"</string>
<string name="restUL">"Reset unit list"</string>
<string name="restInfo">"Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."</string>
<string name="restDone">"Reset done"</string>
<string name="restCuiL">"Reset cuisine list"</string>
<string name="restCatL">"Reset category list"</string>
<string name="rest">"Reset"</string>
<string name="resNF">"Recipe not found"</string>
<string name="req">"Required %1$s"</string>
<string name="recU">"Updated:"</string>
<string name="recTitle">"My Healthy Recipe"</string>
<string name="recs">"recipes"</string>
<string name="recRm">"Recipe removed"</string>
<string name="recPic">"Recipe photo"</string>
<string name="recListEmp">"Nothing here! Add some recipes and try again"</string>
<string name="recI">"Imported:"</string>
<string name="recF">"recipes found"</string>
<string name="recE">"Already exist:"</string>
<string name="rec">"Recipe"</string>
<string name="rBtn">"REMOVE"</string>
<string name="Rating">"Rating"</string>
<string name="_Quickest_first_Z1CpP7N">"Quickest first"</string>
<string name="qt">"qt"</string>
<string name="pt">"pt"</string>
<string name="priv">"Privacy policy"</string>
<string name="prepT">"Preparation time"</string>
<string name="Pound">"Pound"</string>
<string name="Poultry">"Poultry"</string>
<string name="Portuguese">"Portuguese"</string>
<string name="plsAdd">"Use the plus button to add one"</string>
<string name="planner">"Meal Planner"</string>
<string name="pinch">"pinch"</string>
<string name="Piece">"Piece"</string>
<string name="piece">"piece"</string>
<string name="pht">"Recipe photo"</string>
<string name="photogrid">"Photo Grid"</string>
<string name="Patty">"Patty"</string>
<string name="Pasta">"Pasta"</string>
<string name="oz">"oz"</string>
<string name="Ounce">"Ounce"</string>
<string name="opts">"Options"</string>
<string name="_Oldest_first_Z6cq4h">"Oldest first"</string>
<string name="OK">"OK"</string>
<string name="October">"October"</string>
<string name="nwYiU">"New yield unit"</string>
<string name="nwCat">"New category"</string>
<string name="November">"November"</string>
<string name="nos">"Notes"</string>
<string name="noRecsInL">"None of the recipes here matches your search"</string>
<string name="noRecs">"No recipes match your search"</string>
<string name="Noodles">"Noodles"</string>
<string name="noFavs">"No favorites yet"</string>
<string name="noAccSensor">"Accelerometer sensor is either disabled or is not working"</string>
<string name="no">"Note"</string>
<string name="nNBtn">"NOT NOW"</string>
<string name="nLangInfo">"Restart EnRecipes to use the new language"</string>
<string name="Nigerian">"Nigerian"</string>
<string name="newUnit">"New unit"</string>
<string name="newRec">"New recipe"</string>
<string name="_Newest_first_2Sb3c">"Newest first"</string>
<string name="newCui">"New cuisine"</string>
<string name="MON">"MON"</string>
<string name="Moderate">"Moderate"</string>
<string name="ml">"ml"</string>
<string name="minimal">"Minimal"</string>
<string name="min">"min"</string>
<string name="Millilitre">"Milliliter"</string>
<string name="mg">"mg"</string>
<string name="Mexican">"Mexican"</string>
<string name="medium">"medium"</string>
<string name="Meat">"Meat"</string>
<string name="May">"May"</string>
<string name="March">"March"</string>
<string name="_Main_dishes_u6RGQ">"Main dishes"</string>
<string name="mAgo">"%1$s months ago"</string>
<string name="lunch">"Lunch"</string>
<string name="ltAgo">"a long time ago"</string>
<string name="Loaf">"Loaf"</string>
<string name="Litre">"Liter"</string>
<string name="listVM">"List view mode"</string>
<string name="Light">"Light"</string>
<string name="leaf">"leaf"</string>
<string name="lb">"lb"</string>
<string name="_Last_updated_Z2gEbLD">"Last updated"</string>
<string name="large">"large"</string>
<string name="lang">"Language"</string>
<string name="l">"l"</string>
<string name="Korean">"Korean"</string>
<string name="Kilogram">"Kilogram"</string>
<string name="kg">"kg"</string>
<string name="Kenyan">"Kenyan"</string>
<string name="kEdit">"KEEP EDITING"</string>
<string name="June">"June"</string>
<string name="July">"July"</string>
<string name="joinTG">"Join the Telegram group"</string>
<string name="Jewish">"Jewish"</string>
<string name="Japanese">"Japanese"</string>
<string name="January">"January"</string>
<string name="Jamaican">"Jamaican"</string>
<string name="Italian">"Italian"</string>
<string name="it">"Item"</string>
<string name="Irish">"Irish"</string>
<string name="invFile">"Invalid file"</string>
<string name="intf">"Interface"</string>
<string name="inss">"Instructions"</string>
<string name="ings">"Ingredients"</string>
<string name="Indian">"Indian"</string>
<string name="in">"in"</string>
<string name="impSuc">"Import success"</string>
<string name="impip">"Import in progress"</string>
<string name="impInfo">"Supports full backups exported by this app"</string>
<string name="impFail">"Import failed"</string>
<string name="impBu">"Import data"</string>
<string name="hr">"h"</string>
<string name="Healthy">"Healthy"</string>
<string name="guide">"User guide"</string>
<string name="grocery">"Grocery List"</string>
<string name="grid">"Grid"</string>
<string name="Greek">"Greek"</string>
<string name="Gram">"Gram"</string>
<string name="gh">"View on GitHub"</string>
<string name="German">"German"</string>
<string name="Gallon">"Gallon"</string>
<string name="gal">"gal"</string>
<string name="g">"g"</string>
<string name="fsList">"Your favorite recipes are listed here"</string>
<string name="FRI">"FRI"</string>
<string name="French">"French"</string>
<string name="_Fluid_Ounce_bd10L">"Fluid Ounce"</string>
<string name="fltr">"Filter"</string>
<string name="_fl_oz_72kqu">"fl oz"</string>
<string name="_Filtered_recipes_Z1alhhu">"Filtered recipes"</string>
<string name="Filipino">"Filipino"</string>
<string name="February">"February"</string>
<string name="favourites">"Favorites"</string>
<string name="expSuc">"Export success"</string>
<string name="expip">"Export in progress"</string>
<string name="expBu">"Export full backup"</string>
<string name="EnRecipes">"EnRecipes"</string>
<string name="English">"English"</string>
<string name="Egyptian">"Egyptian"</string>
<string name="editRec">"Edit recipe"</string>
<string name="Easy">"Easy"</string>
<string name="dsp">"dstspn"</string>
<string name="drop">"drop"</string>
<string name="dozen">"dozen"</string>
<string name="donate">"Donate"</string>
<string name="disc">"This recipe has unsaved changes. What would you like to do?"</string>
<string name="disBtn">"DISCARD"</string>
<string name="dinner">"Dinner"</string>
<string name="_Difficulty_level_cSL5d">"Difficulty level"</string>
<string name="detailed">"Detailed"</string>
<string name="Desserts">"Desserts"</string>
<string name="delRecsInfo">"You are about to permanently delete %1$s"</string>
<string name="delRecInfo">"You are about to permanently delete the recipe %1$s"</string>
<string name="December">"December"</string>
<string name="dBtn">"DELETE"</string>
<string name="db">"Database"</string>
<string name="Dark">"Dark"</string>
<string name="Danish">"Danish"</string>
<string name="dAgo">"%1$s days ago"</string>
<string name="Cup">"Cup"</string>
<string name="cup">"cup"</string>
<string name="cui">"Cuisine"</string>
<string name="Created">"Created"</string>
<string name="cPic">"Crop photo"</string>
<string name="cookT">"Cooking time"</string>
<string name="conf">"Confirm"</string>
<string name="conBtn">"CONTINUE"</string>
<string name="cmbs">"Combinations"</string>
<string name="cm">"cm"</string>
<string name="clove">"clove"</string>
<string name="Chinese">"Chinese"</string>
<string name="Challenging">"Challenging"</string>
<string name="cBtn">"CANCEL"</string>
<string name="cat">"Category"</string>
<string name="buMod">"The backup file was modified elsewhere"</string>
<string name="buInfo">"Generates a ZIP file containing all your data that can be imported back"</string>
<string name="buInc">"Malformed or corrupt backup file"</string>
<string name="buFol">"Backup folder"</string>
<string name="buEmp">"The backup file is empty"</string>
<string name="British">"British"</string>
<string name="breakfast">"Breakfast"</string>
<string name="Breads">"Breads"</string>
<string name="Brazilian">"Brazilian"</string>
<string name="Black">"Black"</string>
<string name="Beverages">"Beverages"</string>
<string name="Barbecue">"Barbecue"</string>
<string name="August">"August"</string>
<string name="aStpBtn">"ADD STEP"</string>
<string name="April">"April"</string>
<string name="appRst">"App restart required"</string>
<string name="apply">"APPLY"</string>
<string name="appInfo">"EnRecipes is an open source, privacy-friendly digital cookbook that lets you create, manage and share your recipes"</string>
<string name="Appetizers">"Appetizers"</string>
<string name="appCrd">"Shared via EnRecipes. Get it on F-Droid, IzzyOnDroid or the Play Store."</string>
<string name="_app_name_1k3Sbz">"EnRecipes"</string>
<string name="app_name">"EnRecipes"</string>
<string name="title_activity_kimera">"EnRecipes"</string>
<string name="aNoBtn">"ADD NOTE"</string>
<string name="aNBtn">"ADD NEW"</string>
<string name="American">"American"</string>
<string name="allTs">"All Tags"</string>
<string name="allCuis">"All Cuisines"</string>
<string name="allCats">"All Categories"</string>
<string name="aIngBtn">"ADD INGREDIENT"</string>
<string name="aFBu">"Add a recipe to perform a backup"</string>
<string name="addCmbBtn">"ADD COMBINATION"</string>
<string name="aD">"All done!"</string>
<string name="aBtn">"ADD"</string>
<string name="About">"About"</string>
<string name="aap">"Attach a photo"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -0,0 +1,318 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="aap">"Adjuntá una foto"</string>
<string name="About">"Acerca de"</string>
<string name="aBtn">"AGREGAR"</string>
<string name="aD">"¡Todo listo!"</string>
<string name="addCmbBtn">"AGREGAR COMBINACIÓN"</string>
<string name="aFBu">"Agregá recetas para hacer un backup"</string>
<string name="aIngBtn">"AGREGAR INGREDIENTE"</string>
<string name="allCats">"Todas las categorías"</string>
<string name="American">"Americana"</string>
<string name="aNBtn">"AGREGAR NUEVA"</string>
<string name="aNoBtn">"AGREGAR NOTA"</string>
<string name="appCrd">"Compartido vía EnRecipes. Conseguilo en F-Droid, IzzyOnDroid o en la Play Store."</string>
<string name="Appetizers">"Aperitivos"</string>
<string name="appInfo">"EnRecipes es un libro de cocina digital, privado y de código abierto, que te permite crear, administrar y compartir tus recetas"</string>
<string name="apply">"APLICAR"</string>
<string name="appRst">"Se requiere reiniciar la app"</string>
<string name="April">"Abril"</string>
<string name="aStpBtn">"AGREGAR PASO"</string>
<string name="August">"Agosto"</string>
<string name="sec">"s"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
<string name="seconds">"seconds"</string>
<string name="hours">"hours"</string>
<string name="hour">"hour"</string>
<string name="minutes">"minutes"</string>
<string name="minute">"minute"</string>
<string name="dlyDur">"Delay duration"</string>
<string name="tmrvbrt">"Timer vibrate"</string>
<string name="tmrSnd">"Timer sound"</string>
<string name="aTPrst">"Added to presets"</string>
<string name="fwr">"for which recipe?"</string>
<string name="tmrPrsts">"Timer presets"</string>
<string name="prstBtn">"PRESETS"</string>
<string name="tmr">"Timer %1$s"</string>
<string name="delay">"Delay"</string>
<string name="stop">"Stop"</string>
<string name="strtBtn">"START"</string>
<string name="ntmr">"New timer"</string>
<string name="timer">"Cooking Timer"</string>
<string name="sysDefB">"System default + Black"</string>
<string name="buto">"Backed up to %1$s"</string>
<string name="yld">"Yield"</string>
<string name="yieldU">"Yield unit"</string>
<string name="yieldQ">"Yield quantity"</string>
<string name="yesterday">"yesterday"</string>
<string name="WED">"WED"</string>
<string name="wAgo">"%1$s weeks ago"</string>
<string name="Vietnamese">"Vietnamese"</string>
<string name="Vegetarian">"Vegetarian"</string>
<string name="Vegan">"Vegan"</string>
<string name="untRec">"Untitled Recipe"</string>
<string name="unsaved">"Unsaved changes"</string>
<string name="Unit">"Unit"</string>
<string name="unit">"unit"</string>
<string name="Undefined">"Undefined"</string>
<string name="Turkish">"Turkish"</string>
<string name="TUE">"TUE"</string>
<string name="tsp">"tsp"</string>
<string name="tsInfo">"separate with spaces"</string>
<string name="ts">"Tags"</string>
<string name="trySer">"SEARCH IN ALL THE RECIPES?"</string>
<string name="trylater">"Try Later"</string>
<string name="trnsl">"Translate"</string>
<string name="triedInfo">"You tried this recipe %1$s"</string>
<string name="today">"today"</string>
<string name="tLInfo">"Recipes you want to try later are listed here"</string>
<string name="title">"Title"</string>
<string name="THU">"THU"</string>
<string name="Theme">"Theme"</string>
<string name="Thai">"Thai"</string>
<string name="Teaspoon">"Teaspoon"</string>
<string name="tbsp">"tbsp"</string>
<string name="Tablespoon">"Tablespoon"</string>
<string name="sysDef">"System default"</string>
<string name="swm">"Start week on Monday"</string>
<string name="Swedish">"Swedish"</string>
<string name="sVwInfo">"Helps you choose what to cook when you can\'t decide"</string>
<string name="sVw">"Shake to view random recipe"</string>
<string name="SUN">"SUN"</string>
<string name="strAdd">"Start adding your recipes!"</string>
<string name="stp">"Step"</string>
<string name="stick">"stick"</string>
<string name="stars">"Star rating"</string>
<string name="sru">"Share recipe using..."</string>
<string name="srt">"Sort"</string>
<string name="srpu">"Share recipe photo using..."</string>
<string name="_Sri_Lankan_Z7GfBa">"Sri Lankan"</string>
<string name="Spanish">"Spanish"</string>
<string name="Soups">"Soups"</string>
<string name="snacks">"Snacks"</string>
<string name="small">"small"</string>
<string name="sltd">"selected"</string>
<string name="_Slowest_first_hHjY6">"Slowest first"</string>
<string name="simple">"Simple"</string>
<string name="_Side_dishes_Z1Et4Vg">"Side dishes"</string>
<string name="shr">"Share"</string>
<string name="Settings">"Settings"</string>
<string name="SET">"SET"</string>
<string name="Serving">"Serving"</string>
<string name="ser">"Search"</string>
<string name="September">"September"</string>
<string name="selRec">"Select recipe"</string>
<string name="Seafood">"Seafood"</string>
<string name="Scottish">"Scottish"</string>
<string name="Sauces">"Sauces"</string>
<string name="SAT">"SAT"</string>
<string name="Salads">"Salads"</string>
<string name="Russian">"Russian"</string>
<string name="rst">"RESTART"</string>
<string name="rp">"Remove photo"</string>
<string name="Roll">"Roll"</string>
<string name="rmYUInfo">"You are about to remove %1$s from the yield unit list"</string>
<string name="rmUInfo">"You are about to remove %1$s from the unit list"</string>
<string name="rmN">"Note removed"</string>
<string name="rmIns">"Instruction removed"</string>
<string name="rmIng">"Ingredient removed"</string>
<string name="rmCuiInfo">"You are about to remove %1$s from the cuisine list"</string>
<string name="rmCmb">"Combination removed"</string>
<string name="rmCatInfo">"You are about to remove %1$s from the category list"</string>
<string name="Rice">"Rice"</string>
<string name="restYUL">"Reset yield unit list"</string>
<string name="restUL">"Reset unit list"</string>
<string name="restInfo">"Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."</string>
<string name="restDone">"Reset done"</string>
<string name="restCuiL">"Reset cuisine list"</string>
<string name="restCatL">"Reset category list"</string>
<string name="rest">"Reset"</string>
<string name="resNF">"Recipe not found"</string>
<string name="req">"Required %1$s"</string>
<string name="recU">"Updated:"</string>
<string name="recTitle">"My Healthy Recipe"</string>
<string name="recs">"recipes"</string>
<string name="recRm">"Recipe removed"</string>
<string name="recPic">"Recipe photo"</string>
<string name="recListEmp">"Nothing here! Add some recipes and try again"</string>
<string name="recI">"Imported:"</string>
<string name="recF">"recipes found"</string>
<string name="recE">"Already exist:"</string>
<string name="rec">"Recipe"</string>
<string name="rBtn">"REMOVE"</string>
<string name="Rating">"Rating"</string>
<string name="_Quickest_first_Z1CpP7N">"Quickest first"</string>
<string name="qt">"qt"</string>
<string name="pt">"pt"</string>
<string name="priv">"Privacy policy"</string>
<string name="prepT">"Preparation time"</string>
<string name="Pound">"Pound"</string>
<string name="Poultry">"Poultry"</string>
<string name="Portuguese">"Portuguese"</string>
<string name="plsAdd">"Use the plus button to add one"</string>
<string name="planner">"Meal Planner"</string>
<string name="pinch">"pinch"</string>
<string name="Piece">"Piece"</string>
<string name="piece">"piece"</string>
<string name="pht">"Recipe photo"</string>
<string name="photogrid">"Photo Grid"</string>
<string name="Patty">"Patty"</string>
<string name="Pasta">"Pasta"</string>
<string name="oz">"oz"</string>
<string name="Ounce">"Ounce"</string>
<string name="opts">"Options"</string>
<string name="_Oldest_first_Z6cq4h">"Oldest first"</string>
<string name="OK">"OK"</string>
<string name="October">"October"</string>
<string name="nwYiU">"New yield unit"</string>
<string name="nwCat">"New category"</string>
<string name="November">"November"</string>
<string name="nos">"Notes"</string>
<string name="noRecsInL">"None of the recipes here matches your search"</string>
<string name="noRecs">"No recipes match your search"</string>
<string name="Noodles">"Noodles"</string>
<string name="noFavs">"No favourites yet"</string>
<string name="noAccSensor">"Accelerometer sensor is either disabled or is not working"</string>
<string name="no">"Note"</string>
<string name="nNBtn">"NOT NOW"</string>
<string name="nLangInfo">"Restart EnRecipes to use the new language"</string>
<string name="Nigerian">"Nigerian"</string>
<string name="newUnit">"New unit"</string>
<string name="newRec">"New recipe"</string>
<string name="_Newest_first_2Sb3c">"Newest first"</string>
<string name="newCui">"New cuisine"</string>
<string name="MON">"MON"</string>
<string name="Moderate">"Moderate"</string>
<string name="ml">"ml"</string>
<string name="minimal">"Minimal"</string>
<string name="min">"min"</string>
<string name="Millilitre">"Millilitre"</string>
<string name="mg">"mg"</string>
<string name="Mexican">"Mexican"</string>
<string name="medium">"medium"</string>
<string name="Meat">"Meat"</string>
<string name="May">"May"</string>
<string name="March">"March"</string>
<string name="_Main_dishes_u6RGQ">"Main dishes"</string>
<string name="mAgo">"%1$s months ago"</string>
<string name="lunch">"Lunch"</string>
<string name="ltAgo">"a long time ago"</string>
<string name="Loaf">"Loaf"</string>
<string name="Litre">"Litre"</string>
<string name="listVM">"List view mode"</string>
<string name="Light">"Light"</string>
<string name="leaf">"leaf"</string>
<string name="lb">"lb"</string>
<string name="_Last_updated_Z2gEbLD">"Last updated"</string>
<string name="large">"large"</string>
<string name="lang">"Language"</string>
<string name="l">"l"</string>
<string name="Korean">"Korean"</string>
<string name="Kilogram">"Kilogram"</string>
<string name="kg">"kg"</string>
<string name="Kenyan">"Kenyan"</string>
<string name="kEdit">"KEEP EDITING"</string>
<string name="June">"June"</string>
<string name="July">"July"</string>
<string name="joinTG">"Join the Telegram group"</string>
<string name="Jewish">"Jewish"</string>
<string name="Japanese">"Japanese"</string>
<string name="January">"January"</string>
<string name="Jamaican">"Jamaican"</string>
<string name="Italian">"Italian"</string>
<string name="it">"Item"</string>
<string name="Irish">"Irish"</string>
<string name="invFile">"Invalid file"</string>
<string name="intf">"Interface"</string>
<string name="inss">"Instructions"</string>
<string name="ings">"Ingredients"</string>
<string name="Indian">"Indian"</string>
<string name="in">"in"</string>
<string name="impSuc">"Import success"</string>
<string name="impip">"Import in progress"</string>
<string name="impInfo">"Supports full backups exported by this app"</string>
<string name="impFail">"Import failed"</string>
<string name="impBu">"Import data"</string>
<string name="hr">"hr"</string>
<string name="Healthy">"Healthy"</string>
<string name="guide">"User guide"</string>
<string name="grocery">"Grocery List"</string>
<string name="grid">"Grid"</string>
<string name="Greek">"Greek"</string>
<string name="Gram">"Gram"</string>
<string name="gh">"View on GitHub"</string>
<string name="German">"German"</string>
<string name="Gallon">"Gallon"</string>
<string name="gal">"gal"</string>
<string name="g">"g"</string>
<string name="fsList">"Your favourite recipes are listed here"</string>
<string name="FRI">"FRI"</string>
<string name="French">"French"</string>
<string name="_Fluid_Ounce_bd10L">"Fluid Ounce"</string>
<string name="fltr">"Filter"</string>
<string name="_fl_oz_72kqu">"fl oz"</string>
<string name="_Filtered_recipes_Z1alhhu">"Filtered recipes"</string>
<string name="Filipino">"Filipino"</string>
<string name="February">"February"</string>
<string name="favourites">"Favourites"</string>
<string name="expSuc">"Export success"</string>
<string name="expip">"Export in progress"</string>
<string name="expBu">"Export full backup"</string>
<string name="EnRecipes">"EnRecipes"</string>
<string name="English">"English"</string>
<string name="Egyptian">"Egyptian"</string>
<string name="editRec">"Edit recipe"</string>
<string name="Easy">"Easy"</string>
<string name="dsp">"dstspn"</string>
<string name="drop">"drop"</string>
<string name="dozen">"dozen"</string>
<string name="donate">"Donate"</string>
<string name="disc">"This recipe has unsaved changes. What would you like to do?"</string>
<string name="disBtn">"DISCARD"</string>
<string name="dinner">"Dinner"</string>
<string name="_Difficulty_level_cSL5d">"Difficulty level"</string>
<string name="detailed">"Detailed"</string>
<string name="Desserts">"Desserts"</string>
<string name="delRecsInfo">"You are about to permanently delete %1$s"</string>
<string name="delRecInfo">"You are about to permanently delete the recipe %1$s"</string>
<string name="December">"December"</string>
<string name="dBtn">"DELETE"</string>
<string name="db">"Database"</string>
<string name="Dark">"Dark"</string>
<string name="Danish">"Danish"</string>
<string name="dAgo">"%1$s days ago"</string>
<string name="Cup">"Cup"</string>
<string name="cup">"cup"</string>
<string name="cui">"Cuisine"</string>
<string name="Created">"Created"</string>
<string name="cPic">"Crop photo"</string>
<string name="cookT">"Cooking time"</string>
<string name="conf">"Confirm"</string>
<string name="conBtn">"CONTINUE"</string>
<string name="cmbs">"Combinations"</string>
<string name="cm">"cm"</string>
<string name="clove">"clove"</string>
<string name="Chinese">"Chinese"</string>
<string name="Challenging">"Challenging"</string>
<string name="cBtn">"CANCEL"</string>
<string name="cat">"Category"</string>
<string name="buMod">"The backup file was modified elsewhere"</string>
<string name="buInfo">"Generates a ZIP file containing all your data that can be imported back"</string>
<string name="buInc">"Malformed or corrupt backup file"</string>
<string name="buFol">"Backup folder"</string>
<string name="buEmp">"The backup file is empty"</string>
<string name="British">"British"</string>
<string name="breakfast">"Breakfast"</string>
<string name="Breads">"Breads"</string>
<string name="Brazilian">"Brazilian"</string>
<string name="Black">"Black"</string>
<string name="Beverages">"Beverages"</string>
<string name="Barbecue">"Barbecue"</string>
<string name="_app_name_1k3Sbz">"EnRecipes"</string>
<string name="app_name">"EnRecipes"</string>
<string name="title_activity_kimera">"EnRecipes"</string>
<string name="allTs">"All Tags"</string>
<string name="allCuis">"All Cuisines"</string>
<string name="tmrClr">"tmrClr"</string>
</resources>

View file

@ -1,5 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tmrClr">"Temporizador borrado"</string>
<string name="dlyDur">"Duración del retraso"</string>
<string name="tmrvbrt">"Vibrador del temporizador"</string>
<string name="tmrSnd">"Sonido del temporizador"</string>
<string name="aTPrst">"Añadido a los preajustes"</string>
<string name="fwr">"para qué receta?"</string>
<string name="tmrPrsts">"Preselecciones del temporizador"</string>
<string name="prstBtn">"PRECIPIOS"</string>
<string name="delay">"Retraso"</string>
<string name="stop">"Detener"</string>
<string name="minute">"minuto"</string>
<string name="minutes">"minutos"</string>
<string name="hour">"hora"</string>
<string name="hours">"horas"</string>
<string name="seconds">"segundos"</string>
<string name="tmr">"Temporizador %1$s"</string>
<string name="strtBtn">"INICIO"</string>
<string name="ntmr">"Nuevo temporizador"</string>
<string name="timer">"Temporizador de cocción"</string>
<string name="sec">"s"</string>
<string name="sysDefB">"Por defecto del Sistema + Negro"</string>
<string name="buto">"Copia de seguridad guardada a %1$s"</string>
<string name="yld">"Producir"</string>
<string name="yieldU">"Unidad de medida"</string>
@ -292,4 +313,6 @@
<string name="aBtn">"AÑADIR"</string>
<string name="About">"Acerca de"</string>
<string name="aap">"Adjuntar una foto"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -0,0 +1,318 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="minute">"minuutti"</string>
<string name="hour">"tunti"</string>
<string name="minutes">"minuuttia"</string>
<string name="hours">"tuntia"</string>
<string name="seconds">"sekuntia"</string>
<string name="dlyDur">"Viiveen kesto"</string>
<string name="sec">"s"</string>
<string name="prstBtn">"ESIASETUKSET"</string>
<string name="tmrPrsts">"Ajastimen esiasetukset"</string>
<string name="fwr">"mitä reseptiä varten?"</string>
<string name="aTPrst">"Lisätty esiasetuksiin"</string>
<string name="tmrSnd">"Ajastinääni"</string>
<string name="timer">"Keittoajastin"</string>
<string name="ntmr">"Uusi ajastin"</string>
<string name="stop">"Pysäytä"</string>
<string name="tmr">"Ajastin %1$s"</string>
<string name="sysDefB">"Järjestelmän oletusarvo + Musta"</string>
<string name="buto">""</string>
<string name="yld">""</string>
<string name="yieldU">""</string>
<string name="yieldQ">""</string>
<string name="yesterday">"eilen"</string>
<string name="WED">"ke"</string>
<string name="wAgo">"%1$s viikkoa sitten"</string>
<string name="Vietnamese">"vietnamilainen"</string>
<string name="Vegetarian">"Kasvissyöjä"</string>
<string name="Vegan">"Vegaani"</string>
<string name="untRec">""</string>
<string name="unsaved">""</string>
<string name="Unit">""</string>
<string name="unit">""</string>
<string name="Undefined">"Määrittelemätön"</string>
<string name="Turkish">""</string>
<string name="TUE">"ti"</string>
<string name="tsp">""</string>
<string name="tsInfo">""</string>
<string name="ts">"Tunnisteet"</string>
<string name="trySer">"ETSI KAIKISTA RESEPTEISTÄ?"</string>
<string name="trylater">""</string>
<string name="trnsl">"Käännä"</string>
<string name="triedInfo">"Kokeilit tätä reseptiä %1$s"</string>
<string name="today">"tänään"</string>
<string name="tLInfo">"Reseptit, joita haluat kokeilla myöhemmin, on lueteltu täällä"</string>
<string name="title">"Otsikko"</string>
<string name="THU">"to"</string>
<string name="Theme">"Teema"</string>
<string name="Thai">"thaimaalainen"</string>
<string name="Teaspoon">""</string>
<string name="tbsp">""</string>
<string name="Tablespoon">""</string>
<string name="sysDef">"Järjestelmän oletus"</string>
<string name="swm">"Aloita viikko maanantaina"</string>
<string name="Swedish">"ruotsalainen"</string>
<string name="sVwInfo">"Auttaa sinua valitsemaan, mitä valmistaa, kun et osaa päättää."</string>
<string name="sVw">"Ravista nähdäksesi satunnainen resepti"</string>
<string name="SUN">"su"</string>
<string name="strAdd">""</string>
<string name="stp">""</string>
<string name="stick">""</string>
<string name="stars">""</string>
<string name="sru">"Jaa resepti käyttämällä…"</string>
<string name="srt">"Järjestä"</string>
<string name="srpu">"Jaa reseptikuva käyttämällä…"</string>
<string name="_Sri_Lankan_Z7GfBa">"srilankalainen"</string>
<string name="Spanish">"espanjalainen"</string>
<string name="Soups">"Keitot"</string>
<string name="snacks">""</string>
<string name="small">""</string>
<string name="sltd">""</string>
<string name="_Slowest_first_hHjY6">""</string>
<string name="simple">""</string>
<string name="_Side_dishes_Z1Et4Vg">""</string>
<string name="shr">"Jaa"</string>
<string name="Settings">"Asetukset"</string>
<string name="SET">"ASETA"</string>
<string name="Serving">""</string>
<string name="ser">"Etsi"</string>
<string name="September">""</string>
<string name="selRec">""</string>
<string name="Seafood">""</string>
<string name="Scottish">"skotlantilainen"</string>
<string name="Sauces">"Kastikkeet"</string>
<string name="SAT">"la"</string>
<string name="Salads">"Salaatit"</string>
<string name="Russian">"venäläinen"</string>
<string name="rst">"UUDELLEENKÄYNNISTÄ"</string>
<string name="rp">"Poista valokuva"</string>
<string name="Roll">""</string>
<string name="rmYUInfo">""</string>
<string name="rmUInfo">""</string>
<string name="rmN">"Huomautus poistettu"</string>
<string name="rmIns">"Ohje poistettu"</string>
<string name="rmIng">"Ainesosa poistettu"</string>
<string name="rmCuiInfo">""</string>
<string name="rmCmb">"Yhdistelmä poistettu"</string>
<string name="rmCatInfo">"Olet poistamassa %1$s luokkaluettelosta"</string>
<string name="Rice">"Riisi"</string>
<string name="restYUL">""</string>
<string name="restUL">""</string>
<string name="restInfo">""</string>
<string name="restDone">""</string>
<string name="restCuiL">""</string>
<string name="restCatL">""</string>
<string name="rest">"Nollaa"</string>
<string name="resNF">""</string>
<string name="req">""</string>
<string name="recU">"Päivitetty:"</string>
<string name="recTitle">"Minun terveellinen reseptini"</string>
<string name="recs">"reseptiä"</string>
<string name="recRm">"Resepti poistettu"</string>
<string name="recPic">"Reseptivalokuva"</string>
<string name="recListEmp">""</string>
<string name="recI">""</string>
<string name="recF">"löydettyä reseptiä"</string>
<string name="recE">"On jo olemassa:"</string>
<string name="rec">"Resepti"</string>
<string name="rBtn">"POISTA"</string>
<string name="Rating">""</string>
<string name="_Quickest_first_Z1CpP7N">""</string>
<string name="qt">""</string>
<string name="pt">""</string>
<string name="priv">"Tietosuojakäytäntö"</string>
<string name="prepT">"Valmisteluaika"</string>
<string name="Pound">""</string>
<string name="Poultry">""</string>
<string name="Portuguese">"portugalilainen"</string>
<string name="plsAdd">"Lisää resepti pluspainikkeella"</string>
<string name="planner">"Ateriasuunnittelija"</string>
<string name="pinch">""</string>
<string name="Piece">"Pala"</string>
<string name="piece">"pala"</string>
<string name="pht">"Reseptivalokuva"</string>
<string name="photogrid">""</string>
<string name="Patty">""</string>
<string name="Pasta">""</string>
<string name="oz">""</string>
<string name="Ounce">""</string>
<string name="opts">"Valinnat"</string>
<string name="_Oldest_first_Z6cq4h">""</string>
<string name="OK">"OK"</string>
<string name="October">"lokakuu"</string>
<string name="nwYiU">""</string>
<string name="nwCat">"Uusi luokka"</string>
<string name="November">"marraskuu"</string>
<string name="nos">""</string>
<string name="noRecsInL">""</string>
<string name="noRecs">"Hakua vastaavia reseptejä ei ole"</string>
<string name="Noodles">""</string>
<string name="noFavs">""</string>
<string name="noAccSensor">""</string>
<string name="no">""</string>
<string name="nNBtn">""</string>
<string name="nLangInfo">""</string>
<string name="Nigerian">""</string>
<string name="newUnit">""</string>
<string name="newRec">""</string>
<string name="_Newest_first_2Sb3c">""</string>
<string name="newCui">""</string>
<string name="MON">""</string>
<string name="Moderate">""</string>
<string name="ml">""</string>
<string name="minimal">""</string>
<string name="min">""</string>
<string name="Millilitre">""</string>
<string name="mg">""</string>
<string name="Mexican">""</string>
<string name="medium">""</string>
<string name="Meat">""</string>
<string name="May">""</string>
<string name="March">""</string>
<string name="_Main_dishes_u6RGQ">""</string>
<string name="mAgo">""</string>
<string name="lunch">""</string>
<string name="ltAgo">""</string>
<string name="Loaf">""</string>
<string name="Litre">""</string>
<string name="listVM">""</string>
<string name="Light">""</string>
<string name="leaf">""</string>
<string name="lb">""</string>
<string name="_Last_updated_Z2gEbLD">""</string>
<string name="large">""</string>
<string name="lang">"Kieli"</string>
<string name="l">"l"</string>
<string name="Korean">"korealainen"</string>
<string name="Kilogram">"kilogramma"</string>
<string name="kg">"kg"</string>
<string name="Kenyan">""</string>
<string name="kEdit">""</string>
<string name="June">"kesäkuu"</string>
<string name="July">"heinäkuu"</string>
<string name="joinTG">""</string>
<string name="Jewish">"juutalainen"</string>
<string name="Japanese">"japanilainen"</string>
<string name="January">"tammikuu"</string>
<string name="Jamaican">""</string>
<string name="Italian">""</string>
<string name="it">""</string>
<string name="Irish">"irlantilainen"</string>
<string name="invFile">"Virheellinen tiedosto"</string>
<string name="intf">"Käyttöliittymä"</string>
<string name="inss">"Ohjeet"</string>
<string name="ings">"Ainekset"</string>
<string name="Indian">"intialainen"</string>
<string name="in">""</string>
<string name="impSuc">"Tuonti onnistui"</string>
<string name="impip">"Tuonti käynnissä"</string>
<string name="impInfo">"Tukee tämän sovelluksen viemiä täydellisiä varmuuskopioita"</string>
<string name="impFail">"Tuonti epäonnistui"</string>
<string name="impBu">"Tuo tietoja"</string>
<string name="hr">"t."</string>
<string name="Healthy">"Terveellinen"</string>
<string name="guide">"Käyttöopas"</string>
<string name="grocery">"Ostoslista"</string>
<string name="grid">""</string>
<string name="Greek">"kreikkalainen"</string>
<string name="Gram">"gramma"</string>
<string name="gh">"Näytä GitHub:ssa"</string>
<string name="German">"saksalainen"</string>
<string name="Gallon">""</string>
<string name="gal">""</string>
<string name="g">"g"</string>
<string name="fsList">"Suosikkireseptisi on lueteltu täällä"</string>
<string name="FRI">"pe"</string>
<string name="French">"ranskalainen"</string>
<string name="_Fluid_Ounce_bd10L">""</string>
<string name="fltr">""</string>
<string name="_fl_oz_72kqu">""</string>
<string name="_Filtered_recipes_Z1alhhu">"Suodatetut reseptit"</string>
<string name="Filipino">""</string>
<string name="February">"helmikuu"</string>
<string name="favourites">""</string>
<string name="expSuc">""</string>
<string name="expip">"Vienti käynnissä"</string>
<string name="expBu">"Vie koko varmuuskopio"</string>
<string name="EnRecipes">""</string>
<string name="English">"englantilainen"</string>
<string name="Egyptian">"egyptiläinen"</string>
<string name="editRec">"Muokkaa resepti"</string>
<string name="Easy">"Helppo"</string>
<string name="dsp">""</string>
<string name="drop">""</string>
<string name="dozen">"tusina"</string>
<string name="donate">"Lahjoita"</string>
<string name="disc">"Tässä reseptissä on tallentamattomia muutoksia. Mitä haluaisit tehdä?"</string>
<string name="disBtn">"HYLKÄÄ"</string>
<string name="dinner">"Illallinen"</string>
<string name="_Difficulty_level_cSL5d">"Vaikeustaso"</string>
<string name="detailed">"Yksityiskohtainen"</string>
<string name="Desserts">"Jälkiruoat"</string>
<string name="delRecsInfo">"Olet poistamassa %1$s pysyvästi"</string>
<string name="delRecInfo">"Olet poistamassa reseptiä %1$s pysyvästi"</string>
<string name="December">"joulukuu"</string>
<string name="dBtn">"POISTA"</string>
<string name="db">"Tietokanta"</string>
<string name="Dark">"Tumma"</string>
<string name="Danish">"tanskalainen"</string>
<string name="dAgo">"%1$s päivää sitten"</string>
<string name="Cup">"Kuppi"</string>
<string name="cup">"cup"</string>
<string name="cui">"Keittiö"</string>
<string name="Created">"Luotu"</string>
<string name="cPic">"Rajaa kuva"</string>
<string name="cookT">"Kypsennysaika"</string>
<string name="conf">"Vahvista"</string>
<string name="conBtn">"JATKA"</string>
<string name="cmbs">"Yhdistelmät"</string>
<string name="cm">"cm"</string>
<string name="clove">"kynsi"</string>
<string name="Chinese">"kiinalainen"</string>
<string name="Challenging">"Haastava"</string>
<string name="cBtn">"PERUUTA"</string>
<string name="cat">"Luokka"</string>
<string name="buMod">"Varmuuskopiotiedostoa muutettiin muualla"</string>
<string name="buInfo">"Luo ZIP-tiedoston, joka sisältää kaikki tiedot, jotka voidaan tuoda takaisin"</string>
<string name="buInc">"Virheellinen tai vioittunut varmuuskopiotiedosto"</string>
<string name="buFol">"Varmuuskopioiden hakemisto"</string>
<string name="buEmp">"Varmuuskopiotiedosto on tyhjä"</string>
<string name="British">"brittiläinen"</string>
<string name="breakfast">"Aamiainen"</string>
<string name="Breads">"Leivät"</string>
<string name="Brazilian">"brasilialainen"</string>
<string name="Black">"Musta"</string>
<string name="Beverages">"Juomat"</string>
<string name="Barbecue">"Grilli"</string>
<string name="August">"elokuu"</string>
<string name="aStpBtn">""</string>
<string name="April">"huhtikuu"</string>
<string name="appRst">"Sovelluksen uudelleenkäynnistys vaaditaan"</string>
<string name="apply">"KÄYTÄ"</string>
<string name="appInfo">"EnRecipes on avoimen lähdekoodin, yksityisyyden suojaa kunnioittava digitaalinen keittokirja, jonka avulla voit luoda, hallita ja jakaa reseptejäsi"</string>
<string name="Appetizers">"Alkupalat"</string>
<string name="appCrd">"Jaettu EnRecipesin kautta. Lataa se F-Droidista, IzzyOnDroidista tai Play Storesta."</string>
<string name="_app_name_1k3Sbz">""</string>
<string name="app_name">""</string>
<string name="title_activity_kimera">""</string>
<string name="aNoBtn">"LISÄÄ HUOMAUTUS"</string>
<string name="aNBtn">"LISÄÄ UUSI"</string>
<string name="American">"amerikkalainen"</string>
<string name="allTs">"Kaikki tunnisteet"</string>
<string name="allCuis">"Kaikki keittiöt"</string>
<string name="allCats">"Kaikki luokat"</string>
<string name="aIngBtn">"LISÄÄ AINESOSA"</string>
<string name="aFBu">"Lisää resepti varmuuskopioinnin suorittamiseen"</string>
<string name="addCmbBtn">"LISÄÄ YHDISTELMÄ"</string>
<string name="aD">"Valmista!"</string>
<string name="aBtn">"LISÄÄ"</string>
<string name="About">"Tietoja"</string>
<string name="aap">"Liitä valokuva"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
<string name="tmrvbrt">"Timer vibrate"</string>
<string name="delay">"Delay"</string>
<string name="strtBtn">"START"</string>
<string name="tmrClr">"tmrClr"</string>
</resources>

View file

@ -1,5 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tmrClr">"Minuterie effacée"</string>
<string name="delay">"Retard"</string>
<string name="dlyDur">"Durée du retard"</string>
<string name="minute">"minute"</string>
<string name="minutes">"minutes"</string>
<string name="hour">"heure"</string>
<string name="hours">"heures"</string>
<string name="seconds">"secondes"</string>
<string name="sec">"s"</string>
<string name="timer">"Minuterie de cuisson"</string>
<string name="ntmr">"Nouvelle minuterie"</string>
<string name="strtBtn">"DÉMARRER"</string>
<string name="stop">"Arrêter"</string>
<string name="tmr">"Minuterie %1$s"</string>
<string name="prstBtn">"PRÉRÉGLAGES"</string>
<string name="tmrPrsts">"Préréglages de la minuterie"</string>
<string name="fwr">"pour quelle recette ?"</string>
<string name="aTPrst">"Ajouté aux préréglages"</string>
<string name="tmrSnd">"Son de la minuterie"</string>
<string name="tmrvbrt">"Vibreur de la minuterie"</string>
<string name="sysDefB">"Selon le système + Noir"</string>
<string name="buto">"Sauvegardé dans %1$s"</string>
<string name="yld">"Rendement"</string>
<string name="yieldU">"Unité de rendement"</string>
@ -21,7 +42,7 @@
<string name="tsInfo">"séparez par des espaces"</string>
<string name="ts">"Étiquettes"</string>
<string name="trySer">"RECHERCHE DANS TOUTES LES RECETTES ?"</string>
<string name="trylater">"Essayer plus tard"</string>
<string name="trylater">"À essayer plus tard"</string>
<string name="trnsl">"Traduire"</string>
<string name="triedInfo">"Vous avez essayé cette recette %1$s"</string>
<string name="today">"aujourdhui"</string>
@ -49,7 +70,7 @@
<string name="_Sri_Lankan_Z7GfBa">"sri-lankaise"</string>
<string name="Spanish">"espagnole"</string>
<string name="Soups">"Soupes"</string>
<string name="snacks">"en-cas"</string>
<string name="snacks">"En-cas"</string>
<string name="small">"petit"</string>
<string name="sltd">"sélectionné"</string>
<string name="_Slowest_first_hHjY6">"La plus lente dabord"</string>
@ -88,7 +109,7 @@
<string name="restCatL">"Réinitialiser la liste des catégories"</string>
<string name="rest">"Réinitialiser"</string>
<string name="resNF">"Recette introuvable"</string>
<string name="req">"%1$s requise"</string>
<string name="req">"%1$s requis(e)"</string>
<string name="recU">"mise à jour:"</string>
<string name="recTitle">"Ma recette saine"</string>
<string name="recs">"recettes"</string>
@ -110,7 +131,7 @@
<string name="Poultry">"Volaille"</string>
<string name="Portuguese">"portugaise"</string>
<string name="plsAdd">"Utilisez le bouton plus pour en ajouter une"</string>
<string name="planner">"Organisateur de repas"</string>
<string name="planner">"Planificateur de repas"</string>
<string name="pinch">"pincée"</string>
<string name="Piece">"Morceau"</string>
<string name="piece">"morceau"</string>
@ -155,7 +176,7 @@
<string name="March">"mars"</string>
<string name="_Main_dishes_u6RGQ">"Plats principaux"</string>
<string name="mAgo">"Il y a %1$s mois"</string>
<string name="lunch">"diner"</string>
<string name="lunch">"Diner"</string>
<string name="ltAgo">"il y a longtemps"</string>
<string name="Loaf">"Miche"</string>
<string name="Litre">"Litre"</string>
@ -229,7 +250,7 @@
<string name="donate">"Faire un don"</string>
<string name="disc">"Cette recette a des modifications non enregistrées. Que voudriez-vous faire ?"</string>
<string name="disBtn">"IGNORER"</string>
<string name="dinner">"souper"</string>
<string name="dinner">"Souper"</string>
<string name="_Difficulty_level_cSL5d">"Niveau de difficulté"</string>
<string name="detailed">"Détaillée"</string>
<string name="Desserts">"Desserts"</string>
@ -292,4 +313,6 @@
<string name="aBtn">"AJOUTER"</string>
<string name="About">"À propos"</string>
<string name="aap">"Joindre une photo"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -1,5 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tmrClr">"Minuterie effacée"</string>
<string name="delay">"Retard"</string>
<string name="dlyDur">"Durée du retard"</string>
<string name="minute">"minute"</string>
<string name="minutes">"minutes"</string>
<string name="hour">"heure"</string>
<string name="hours">"heures"</string>
<string name="seconds">"secondes"</string>
<string name="sec">"s"</string>
<string name="timer">"Minuterie de cuisson"</string>
<string name="ntmr">"Nouvelle minuterie"</string>
<string name="strtBtn">"DÉMARRER"</string>
<string name="stop">"Arrêter"</string>
<string name="tmr">"Minuterie %1$s"</string>
<string name="prstBtn">"PRÉRÉGLAGES"</string>
<string name="tmrPrsts">"Préréglages de la minuterie"</string>
<string name="fwr">"pour quelle recette?"</string>
<string name="aTPrst">"Ajouté aux préréglages"</string>
<string name="tmrSnd">"Son de la minuterie"</string>
<string name="tmrvbrt">"Vibreur de la minuterie"</string>
<string name="sysDefB">"Selon le système + Noir"</string>
<string name="buto">"Sauvegardé dans %1$s"</string>
<string name="yld">"Rendement"</string>
<string name="yieldU">"Unité de rendement"</string>
@ -21,7 +42,7 @@
<string name="tsInfo">"séparez par des espaces"</string>
<string name="ts">"Étiquettes"</string>
<string name="trySer">"RECHERCHE DANS TOUTES LES RECETTES?"</string>
<string name="trylater">"Essayer plus tard"</string>
<string name="trylater">"À essayer plus tard"</string>
<string name="trnsl">"Traduire"</string>
<string name="triedInfo">"Vous avez essayé cette recette %1$s"</string>
<string name="today">"aujourdhui"</string>
@ -49,7 +70,7 @@
<string name="_Sri_Lankan_Z7GfBa">"sri-lankaise"</string>
<string name="Spanish">"espagnole"</string>
<string name="Soups">"Soupes"</string>
<string name="snacks">"en-cas"</string>
<string name="snacks">"En-cas"</string>
<string name="small">"petit"</string>
<string name="sltd">"sélectionné"</string>
<string name="_Slowest_first_hHjY6">"La plus lente dabord"</string>
@ -88,7 +109,7 @@
<string name="restCatL">"Réinitialiser la liste des catégories"</string>
<string name="rest">"Réinitialiser"</string>
<string name="resNF">"Recette introuvable"</string>
<string name="req">"%1$s requise"</string>
<string name="req">"%1$s requis(e)"</string>
<string name="recU">"mise à jour:"</string>
<string name="recTitle">"Ma recette saine"</string>
<string name="recs">"recettes"</string>
@ -110,7 +131,7 @@
<string name="Poultry">"Volaille"</string>
<string name="Portuguese">"portugaise"</string>
<string name="plsAdd">"Utilisez le bouton plus pour en ajouter une"</string>
<string name="planner">"Organisateur de repas"</string>
<string name="planner">"Planificateur de repas"</string>
<string name="pinch">"pincée"</string>
<string name="Piece">"Morceau"</string>
<string name="piece">"morceau"</string>
@ -155,7 +176,7 @@
<string name="March">"mars"</string>
<string name="_Main_dishes_u6RGQ">"Plats principaux"</string>
<string name="mAgo">"Il y a %1$s mois"</string>
<string name="lunch">"dîner"</string>
<string name="lunch">"Dîner"</string>
<string name="ltAgo">"il y a longtemps"</string>
<string name="Loaf">"Miche"</string>
<string name="Litre">"Litre"</string>
@ -229,7 +250,7 @@
<string name="donate">"Faire un don"</string>
<string name="disc">"Cette recette a des modifications non enregistrées. Que voudriez-vous faire?"</string>
<string name="disBtn">"IGNORER"</string>
<string name="dinner">"souper"</string>
<string name="dinner">"Souper"</string>
<string name="_Difficulty_level_cSL5d">"Niveau de difficulté"</string>
<string name="detailed">"Détaillée"</string>
<string name="Desserts">"Desserts"</string>
@ -292,4 +313,6 @@
<string name="aBtn">"AJOUTER"</string>
<string name="About">"À propos"</string>
<string name="aap">"Joindre une photo"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -1,5 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tmrClr">"Minuterie effacée"</string>
<string name="delay">"Retard"</string>
<string name="dlyDur">"Durée du retard"</string>
<string name="minute">"minute"</string>
<string name="minutes">"minutes"</string>
<string name="hour">"heure"</string>
<string name="hours">"heures"</string>
<string name="seconds">"secondes"</string>
<string name="sec">"s"</string>
<string name="timer">"Minuterie de cuisson"</string>
<string name="ntmr">"Nouvelle minuterie"</string>
<string name="strtBtn">"DÉMARRER"</string>
<string name="stop">"Arrêter"</string>
<string name="tmr">"Minuterie %1$s"</string>
<string name="prstBtn">"PRÉRÉGLAGES"</string>
<string name="tmrPrsts">"Préréglages de la minuterie"</string>
<string name="fwr">"pour quelle recette?"</string>
<string name="aTPrst">"Ajouté aux préréglages"</string>
<string name="tmrSnd">"Son de la minuterie"</string>
<string name="tmrvbrt">"Vibreur de la minuterie"</string>
<string name="sysDefB">"Selon le système + Noir"</string>
<string name="buto">"Sauvegardé dans %1$s"</string>
<string name="yld">"Rendement"</string>
<string name="yieldU">"Unité de rendement"</string>
@ -21,7 +42,7 @@
<string name="tsInfo">"séparez par des espaces"</string>
<string name="ts">"Étiquettes"</string>
<string name="trySer">"RECHERCHE DANS TOUTES LES RECETTES?"</string>
<string name="trylater">"Essayer plus tard"</string>
<string name="trylater">"À essayer plus tard"</string>
<string name="trnsl">"Traduire"</string>
<string name="triedInfo">"Vous avez essayé cette recette %1$s"</string>
<string name="today">"aujourdhui"</string>
@ -49,7 +70,7 @@
<string name="_Sri_Lankan_Z7GfBa">"sri-lankaise"</string>
<string name="Spanish">"espagnole"</string>
<string name="Soups">"Soupes"</string>
<string name="snacks">"en-cas"</string>
<string name="snacks">"En-cas"</string>
<string name="small">"petit"</string>
<string name="sltd">"sélectionné"</string>
<string name="_Slowest_first_hHjY6">"La plus lente dabord"</string>
@ -88,7 +109,7 @@
<string name="restCatL">"Réinitialiser la liste des catégories"</string>
<string name="rest">"Réinitialiser"</string>
<string name="resNF">"Recette introuvable"</string>
<string name="req">"%1$s requise"</string>
<string name="req">"%1$s requis(e)"</string>
<string name="recU">"mise à jour:"</string>
<string name="recTitle">"Ma recette saine"</string>
<string name="recs">"recettes"</string>
@ -110,7 +131,7 @@
<string name="Poultry">"Volaille"</string>
<string name="Portuguese">"portugaise"</string>
<string name="plsAdd">"Utilisez le bouton plus pour en ajouter une"</string>
<string name="planner">"Organisateur de repas"</string>
<string name="planner">"Planificateur de repas"</string>
<string name="pinch">"pincée"</string>
<string name="Piece">"Morceau"</string>
<string name="piece">"morceau"</string>
@ -155,7 +176,7 @@
<string name="March">"mars"</string>
<string name="_Main_dishes_u6RGQ">"Plats principaux"</string>
<string name="mAgo">"Il y a %1$s mois"</string>
<string name="lunch">"dîner"</string>
<string name="lunch">"Dîner"</string>
<string name="ltAgo">"il y a longtemps"</string>
<string name="Loaf">"Miche"</string>
<string name="Litre">"Litre"</string>
@ -229,7 +250,7 @@
<string name="donate">"Faire un don"</string>
<string name="disc">"Cette recette a des modifications non enregistrées. Que voudriez-vous faire?"</string>
<string name="disBtn">"IGNORER"</string>
<string name="dinner">"souper"</string>
<string name="dinner">"Souper"</string>
<string name="_Difficulty_level_cSL5d">"Niveau de difficulté"</string>
<string name="detailed">"Détaillée"</string>
<string name="Desserts">"Desserts"</string>
@ -292,4 +313,6 @@
<string name="aBtn">"AJOUTER"</string>
<string name="About">"À propos"</string>
<string name="aap">"Joindre une photo"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -1,5 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tmrClr">"Minuterie effacée"</string>
<string name="delay">"Retard"</string>
<string name="dlyDur">"Durée du retard"</string>
<string name="minute">"minute"</string>
<string name="minutes">"minutes"</string>
<string name="hour">"heure"</string>
<string name="hours">"heures"</string>
<string name="seconds">"secondes"</string>
<string name="sec">"s"</string>
<string name="timer">"Minuterie de cuisson"</string>
<string name="ntmr">"Nouvelle minuterie"</string>
<string name="strtBtn">"DÉMARRER"</string>
<string name="stop">"Arrêter"</string>
<string name="tmr">"Minuterie %1$s"</string>
<string name="prstBtn">"PRÉRÉGLAGES"</string>
<string name="tmrPrsts">"Préréglages de la minuterie"</string>
<string name="fwr">"pour quelle recette ?"</string>
<string name="aTPrst">"Ajouté aux préréglages"</string>
<string name="tmrSnd">"Son de la minuterie"</string>
<string name="tmrvbrt">"Vibreur de la minuterie"</string>
<string name="sysDefB">"Selon le système + Noir"</string>
<string name="buto">"Sauvegardé dans %1$s"</string>
<string name="yld">"Rendement"</string>
<string name="yieldU">"Unité de portion"</string>
@ -7,7 +28,7 @@
<string name="yesterday">"hier"</string>
<string name="WED">"mer"</string>
<string name="wAgo">"il y a %1$s semaines"</string>
<string name="Vietnamese">"Vietnamienne"</string>
<string name="Vietnamese">"vietnamienne"</string>
<string name="Vegetarian">"Végétarien"</string>
<string name="Vegan">"Végétalien"</string>
<string name="untRec">"Recette sans titre"</string>
@ -15,13 +36,13 @@
<string name="Unit">"Unité"</string>
<string name="unit">"unité"</string>
<string name="Undefined">"Indéfini"</string>
<string name="Turkish">"Turque"</string>
<string name="Turkish">"turque"</string>
<string name="TUE">"mar"</string>
<string name="tsp">"c.à.c"</string>
<string name="tsInfo">"séparez par des espaces"</string>
<string name="ts">"Étiquettes"</string>
<string name="trySer">"RECHERCHE DANS TOUTES LES RECETTES ?"</string>
<string name="trylater">"Essayer plus tard"</string>
<string name="trylater">"À essayer plus tard"</string>
<string name="trnsl">"Traduire"</string>
<string name="triedInfo">"Vous avez essayé cette recette %1$s"</string>
<string name="today">"aujourdhui"</string>
@ -29,13 +50,13 @@
<string name="title">"Titre"</string>
<string name="THU">"jeu"</string>
<string name="Theme">"Thème"</string>
<string name="Thai">"Thaïlandaise"</string>
<string name="Thai">"thaïlandaise"</string>
<string name="Teaspoon">"Cuillère à café"</string>
<string name="tbsp">"cuillérée"</string>
<string name="Tablespoon">"Cuillère à soupe"</string>
<string name="sysDef">"Selon le système"</string>
<string name="swm">"Début de la semaine le lundi"</string>
<string name="Swedish">"Suédoise"</string>
<string name="Swedish">"suédoise"</string>
<string name="sVwInfo">"Vous aide à choisir quoi cuisiner quand vous ne pouvez pas vous décider"</string>
<string name="sVw">"Secouez pour voir une recette au hasard"</string>
<string name="SUN">"dim"</string>
@ -46,14 +67,14 @@
<string name="sru">"Partager la recette en utilisant…"</string>
<string name="srt">"Trier"</string>
<string name="srpu">"Partager une photo de recette en utilisant…"</string>
<string name="_Sri_Lankan_Z7GfBa">"Sri-lankaise"</string>
<string name="Spanish">"Espagnole"</string>
<string name="_Sri_Lankan_Z7GfBa">"sri-lankaise"</string>
<string name="Spanish">"espagnole"</string>
<string name="Soups">"Soupes"</string>
<string name="snacks">"en-cas"</string>
<string name="snacks">"En-cas"</string>
<string name="small">"petit"</string>
<string name="sltd">"sélectionné"</string>
<string name="_Slowest_first_hHjY6">"La plus lente dabord"</string>
<string name="simple">"Simple"</string>
<string name="simple">"Simplicité"</string>
<string name="_Side_dishes_Z1Et4Vg">"Plats daccompagnement"</string>
<string name="shr">"Partager"</string>
<string name="Settings">"Paramètres"</string>
@ -63,11 +84,11 @@
<string name="September">"septembre"</string>
<string name="selRec">"Sélectionner une recette"</string>
<string name="Seafood">"Fruits de mer"</string>
<string name="Scottish">"Écossaise"</string>
<string name="Sauces">"Sauces"</string>
<string name="Scottish">"écossaise"</string>
<string name="Sauces">"Soupes"</string>
<string name="SAT">"sam"</string>
<string name="Salads">"Salades"</string>
<string name="Russian">"Russe"</string>
<string name="Russian">"russe"</string>
<string name="rst">"REDÉMARRER"</string>
<string name="rp">"Retirer la photo"</string>
<string name="Roll">"Rouleau"</string>
@ -88,7 +109,7 @@
<string name="restCatL">"Réinitialiser la liste des catégories"</string>
<string name="rest">"Réinitialiser"</string>
<string name="resNF">"Recette introuvable"</string>
<string name="req">"%1$s requise"</string>
<string name="req">"%1$s requis(e)"</string>
<string name="recU">"mise à jour:"</string>
<string name="recTitle">"Ma recette saine"</string>
<string name="recs">"recettes"</string>
@ -108,9 +129,9 @@
<string name="prepT">"Temps de préparation"</string>
<string name="Pound">"Livre"</string>
<string name="Poultry">"Volaille"</string>
<string name="Portuguese">"Portugaise"</string>
<string name="Portuguese">"portugaise"</string>
<string name="plsAdd">"Utilisez le bouton plus pour en ajouter une"</string>
<string name="planner">"Organisateur de repas"</string>
<string name="planner">"Planificateur de repas"</string>
<string name="pinch">"pincée"</string>
<string name="Piece">"Morceau"</string>
<string name="piece">"morceau"</string>
@ -136,7 +157,7 @@
<string name="no">"Note"</string>
<string name="nNBtn">"PAS MAINTENANT"</string>
<string name="nLangInfo">"Redémarrez EnRecipes pour utiliser la nouvelle langue"</string>
<string name="Nigerian">"Nigériane"</string>
<string name="Nigerian">"nigériane"</string>
<string name="newUnit">"Nouvelle unité"</string>
<string name="newRec">"Nouvelle recette"</string>
<string name="_Newest_first_2Sb3c">"La plus récente dabord"</string>
@ -146,19 +167,19 @@
<string name="ml">"ml"</string>
<string name="minimal">"Minimale"</string>
<string name="min">"min"</string>
<string name="Millilitre">"Millilitre"</string>
<string name="Millilitre">"Millilette"</string>
<string name="mg">"mg"</string>
<string name="Mexican">"Mexicaine"</string>
<string name="Mexican">"mexicaine"</string>
<string name="medium">"moyen"</string>
<string name="Meat">"Viande"</string>
<string name="May">"mai"</string>
<string name="March">"mars"</string>
<string name="_Main_dishes_u6RGQ">"Plats principaux"</string>
<string name="mAgo">"Il y a %1$s mois"</string>
<string name="lunch">"déjeuner"</string>
<string name="lunch">"Déjeuner"</string>
<string name="ltAgo">"il y a longtemps"</string>
<string name="Loaf">"Miche"</string>
<string name="Litre">"Litre"</string>
<string name="Litre">"Leitre"</string>
<string name="listVM">"Type de vue en liste"</string>
<string name="Light">"Clair"</string>
<string name="leaf">"feuille"</string>
@ -167,26 +188,26 @@
<string name="large">"grand"</string>
<string name="lang">"Langue"</string>
<string name="l">"l"</string>
<string name="Korean">"Coréenne"</string>
<string name="Korean">"coréenne"</string>
<string name="Kilogram">"Kilogramme"</string>
<string name="kg">"kg"</string>
<string name="Kenyan">"Kényane"</string>
<string name="Kenyan">"kényane"</string>
<string name="kEdit">"CONTINUER"</string>
<string name="June">"juin"</string>
<string name="July">"juillet"</string>
<string name="joinTG">"Rejoignez le groupe Telegram"</string>
<string name="Jewish">"Juive"</string>
<string name="Japanese">"Japonaise"</string>
<string name="Jewish">"juive"</string>
<string name="Japanese">"japonaise"</string>
<string name="January">"janvier"</string>
<string name="Jamaican">"Jamaïcaine"</string>
<string name="Italian">"Italienne"</string>
<string name="Jamaican">"jamaïcaine"</string>
<string name="Italian">"italienne"</string>
<string name="it">"Élément"</string>
<string name="Irish">"Irlandaise"</string>
<string name="Irish">"irlandaise"</string>
<string name="invFile">"Fichier invalide"</string>
<string name="intf">"Interface"</string>
<string name="inss">"Instructions"</string>
<string name="ings">"Ingrédients"</string>
<string name="Indian">"Indienne"</string>
<string name="Indian">"indienne"</string>
<string name="in">"in"</string>
<string name="impSuc">"Importation réussie"</string>
<string name="impip">"Importation en cours"</string>
@ -198,29 +219,29 @@
<string name="guide">"Guide dutilisation"</string>
<string name="grocery">"Liste de courses"</string>
<string name="grid">"Grille"</string>
<string name="Greek">"Grecque"</string>
<string name="Greek">"grecque"</string>
<string name="Gram">"Gramme"</string>
<string name="gh">"Voir sur GitHub"</string>
<string name="German">"Allemande"</string>
<string name="Gallon">"Gallon"</string>
<string name="German">"allemande"</string>
<string name="Gallon">"Galon"</string>
<string name="gal">"gal"</string>
<string name="g">"g"</string>
<string name="fsList">"Vos recettes favorites sont listées ici"</string>
<string name="FRI">"ven"</string>
<string name="French">"Française"</string>
<string name="French">"française"</string>
<string name="_Fluid_Ounce_bd10L">"Once liquide"</string>
<string name="fltr">"Filtre"</string>
<string name="_fl_oz_72kqu">"oz liq"</string>
<string name="_Filtered_recipes_Z1alhhu">"Recettes filtrées"</string>
<string name="Filipino">"Philippine"</string>
<string name="Filipino">"philippine"</string>
<string name="February">"février"</string>
<string name="favourites">"Favoris"</string>
<string name="expSuc">"Exportation réussie"</string>
<string name="expip">"Exportation en cours"</string>
<string name="expBu">"Exporter une sauvegarde complète"</string>
<string name="EnRecipes">"EnRecipes"</string>
<string name="English">"Anglaise"</string>
<string name="Egyptian">"Égyptienne"</string>
<string name="English">"anglaise"</string>
<string name="Egyptian">"égyptienne"</string>
<string name="editRec">"Modifier la recette"</string>
<string name="Easy">"Facile"</string>
<string name="dsp">"c.à.d"</string>
@ -229,21 +250,21 @@
<string name="donate">"Faire un don"</string>
<string name="disc">"Cette recette a des modifications non enregistrées. Que voudriez-vous faire ?"</string>
<string name="disBtn">"IGNORER"</string>
<string name="dinner">"dîner"</string>
<string name="dinner">"Dîner"</string>
<string name="_Difficulty_level_cSL5d">"Niveau de difficulté"</string>
<string name="detailed">"Détaillée"</string>
<string name="Desserts">"Desserts"</string>
<string name="Desserts">"Délices"</string>
<string name="delRecsInfo">"Vous êtes sur le point de supprimer définitivement %1$s"</string>
<string name="delRecInfo">"Vous êtes sur le point de supprimer définitivement la recette %1$s"</string>
<string name="December">"décembre"</string>
<string name="dBtn">"SUPPRIMER"</string>
<string name="db">"Base de données"</string>
<string name="Dark">"Sombre"</string>
<string name="Danish">"Danoise"</string>
<string name="Danish">"danoise"</string>
<string name="dAgo">"il y a %1$s jours"</string>
<string name="Cup">"Tasse"</string>
<string name="cup">"tasse"</string>
<string name="cui">"Cuisine"</string>
<string name="cui">"Cuisines"</string>
<string name="Created">"Créé le"</string>
<string name="cPic">"Recadrer la photo"</string>
<string name="cookT">"Temps de cuisson"</string>
@ -252,7 +273,7 @@
<string name="cmbs">"Combinaisons"</string>
<string name="cm">"cm"</string>
<string name="clove">"gousse"</string>
<string name="Chinese">"Chinoise"</string>
<string name="Chinese">"chinoise"</string>
<string name="Challenging">"Difficile"</string>
<string name="cBtn">"ANNULER"</string>
<string name="cat">"Catégorie"</string>
@ -261,13 +282,13 @@
<string name="buInc">"Fichier de sauvegarde mal formé ou corrompu"</string>
<string name="buFol">"Dossier de sauvegarde"</string>
<string name="buEmp">"La sauvegarde est vide"</string>
<string name="British">"Britannique"</string>
<string name="British">"britannique"</string>
<string name="breakfast">"Petit déjeuner"</string>
<string name="Breads">"Pains"</string>
<string name="Brazilian">"Brésilienne"</string>
<string name="Black">"Noir"</string>
<string name="Beverages">"Boissons"</string>
<string name="Barbecue">"Barbecue"</string>
<string name="Barbecue">"Grillades"</string>
<string name="August">"août"</string>
<string name="aStpBtn">"AJOUTER UNE ÉTAPE"</string>
<string name="April">"avril"</string>
@ -292,4 +313,6 @@
<string name="aBtn">"AJOUTER"</string>
<string name="About">"À propos"</string>
<string name="aap">"Joindre une photo"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -1,5 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="sec">"सेकंड"</string>
<string name="timer">"कुकिंग टाइमर"</string>
<string name="ntmr">"नया टाइमर"</string>
<string name="strtBtn">"शुरू"</string>
<string name="stop">"रुकें"</string>
<string name="delay">"देरी"</string>
<string name="tmr">"टाइमर%1$s"</string>
<string name="prstBtn">"प्रीसेट"</string>
<string name="tmrPrsts">"टाइमर प्रीसेट"</string>
<string name="aTPrst">"प्रीसेट में जोड़ा गया"</string>
<string name="tmrSnd">"टाइमर की आवाज़"</string>
<string name="tmrvbrt">"टाइमर वाइब्रेट"</string>
<string name="dlyDur">"विलंब अवधि"</string>
<string name="minute">"मिनट"</string>
<string name="minutes">"मिनटो"</string>
<string name="hour">"घंटा"</string>
<string name="hours">"घंटे"</string>
<string name="seconds">"सेकंड"</string>
<string name="tmrClr">"टाइमर साफ"</string>
<string name="fwr">"किस विधि के लिए?"</string>
<string name="sysDefB">"प्रणालीगत चूक + काला"</string>
<string name="buto">"%1$s में बैकअप लिया गया"</string>
<string name="yld">"मान जाना"</string>
<string name="yieldU">"उपज इकाई"</string>
@ -292,4 +313,6 @@
<string name="aBtn">"जोड़ें"</string>
<string name="About">"तकरीबन"</string>
<string name="aap">"एक तस्वीर लगाओ"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -1,5 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="stop">"Berhenti"</string>
<string name="delay">"Menunda"</string>
<string name="tmr">"Timer %1$s"</string>
<string name="prstBtn">"PRESET"</string>
<string name="tmrPrsts">"Preset timer"</string>
<string name="fwr">"untuk resep yang mana?"</string>
<string name="aTPrst">"Ditambahkan ke preset"</string>
<string name="tmrSnd">"Suara timer"</string>
<string name="tmrvbrt">"Timer bergetar"</string>
<string name="dlyDur">"Durasi penundaan"</string>
<string name="minute">"menit"</string>
<string name="minutes">"menit"</string>
<string name="hour">"jam"</string>
<string name="hours">"jam"</string>
<string name="seconds">"detik"</string>
<string name="tmrClr">"Timer dibersihkan"</string>
<string name="timer">"Timer Memasak"</string>
<string name="ntmr">"Timer baru"</string>
<string name="strtBtn">"MULAI"</string>
<string name="sec">"s"</string>
<string name="sysDefB">"Default sistem + Hitam"</string>
<string name="buto">"Didukung ke %1$s"</string>
<string name="yld">"Menghasilkan"</string>
<string name="yieldU">"Satuan hasil"</string>
@ -292,4 +313,6 @@
<string name="aBtn">"Tambah"</string>
<string name="About">"Tentang"</string>
<string name="aap">"Lampirkan foto"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -1,5 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tmrClr">"Contaminuti cancellato"</string>
<string name="delay">"Ritardo"</string>
<string name="dlyDur">"Durata del ritardo"</string>
<string name="minute">"minuto"</string>
<string name="minutes">"minuti"</string>
<string name="hour">"ora"</string>
<string name="hours">"ore"</string>
<string name="seconds">"secondi"</string>
<string name="sec">"s"</string>
<string name="stop">"Ferma"</string>
<string name="prstBtn">"Preimpostazioni"</string>
<string name="tmrPrsts">"Preimpostazioni del contaminuti"</string>
<string name="fwr">"per quale ricetta?"</string>
<string name="aTPrst">"Aggiunto alle preimpostazioni"</string>
<string name="tmrSnd">"Suono del contaminuti"</string>
<string name="tmrvbrt">"Vibrazione contaminuti"</string>
<string name="timer">"Contaminuti di cottura"</string>
<string name="ntmr">"Nuovo contaminuti"</string>
<string name="strtBtn">"AVVIA"</string>
<string name="tmr">"Contaminuti %1$s"</string>
<string name="sysDefB">"Predefinito del sistema + Nero"</string>
<string name="buto">"Backup salvato in %1$s"</string>
<string name="yld">"Resa"</string>
<string name="yieldU">"Unità di resa"</string>
@ -21,7 +42,7 @@
<string name="tsInfo">"separa con spazi"</string>
<string name="ts">"Etichette"</string>
<string name="trySer">"CERCARE IN TUTTE LE RICETTE?"</string>
<string name="trylater">"Prova più tardi"</string>
<string name="trylater">"Da provare più tardi"</string>
<string name="trnsl">"Traduci"</string>
<string name="triedInfo">"Hai provato questa ricetta %1$s"</string>
<string name="today">"oggi"</string>
@ -117,7 +138,7 @@
<string name="pht">"Foto ricetta"</string>
<string name="photogrid">"Griglia di foto"</string>
<string name="Patty">"Polpetta"</string>
<string name="Pasta">"Pasta"</string>
<string name="Pasta">"Pastore"</string>
<string name="oz">"oz"</string>
<string name="Ounce">"Oncia"</string>
<string name="opts">"Opzioni"</string>
@ -292,4 +313,6 @@
<string name="aBtn">"AGGIUNGI"</string>
<string name="About">"Informazioni"</string>
<string name="aap">"Allega una foto"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -0,0 +1,318 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="medium">"中"</string>
<string name="large">"大"</string>
<string name="small">"小"</string>
<string name="it">"材料"</string>
<string name="lb">"ポンド"</string>
<string name="oz">"オンス"</string>
<string name="pinch">"ピンチ"</string>
<string name="stick">"スティック"</string>
<string name="nNBtn">"あとで"</string>
<string name="Undefined">"未定義"</string>
<string name="in">"中の"</string>
<string name="sysDefB">"システム既定+黒"</string>
<string name="buto">"%1$s としてバックアップしました"</string>
<string name="yld">"仕上がり分量"</string>
<string name="yieldU">"仕上がり分量の単位"</string>
<string name="yieldQ">"仕上がり分量"</string>
<string name="yesterday">"昨日"</string>
<string name="WED">"水"</string>
<string name="wAgo">"%1$s 週前"</string>
<string name="Vietnamese">"ベトナム料理"</string>
<string name="Vegetarian">"ベジタリアン"</string>
<string name="Vegan">"ビーガン"</string>
<string name="untRec">"無題のレシピ"</string>
<string name="unsaved">"未保存の変更"</string>
<string name="Unit">"単位"</string>
<string name="unit">"個"</string>
<string name="Turkish">"トルコ料理"</string>
<string name="TUE">"火"</string>
<string name="tsp">"小さじ"</string>
<string name="tsInfo">"スペースで区切ってください"</string>
<string name="ts">"タグ"</string>
<string name="trySer">"全てのレシピを検索しますか?"</string>
<string name="trylater">"あとで作る"</string>
<string name="trnsl">"翻訳"</string>
<string name="triedInfo">"に作りました"</string>
<string name="today">"今日"</string>
<string name="tLInfo">"あとで試したいレシピはここに並びます"</string>
<string name="title">"タイトル"</string>
<string name="THU">"木"</string>
<string name="Theme">"テーマ"</string>
<string name="Thai">"タイ料理"</string>
<string name="Teaspoon">"小さじ"</string>
<string name="tbsp">"大さじ"</string>
<string name="Tablespoon">"大さじ"</string>
<string name="sysDef">"システム既定"</string>
<string name="swm">"月曜始まりにする"</string>
<string name="Swedish">"スウェーデン料理"</string>
<string name="sVwInfo">"何を作るか決められないときに使います"</string>
<string name="sVw">"振ってランダムなレシピを表示"</string>
<string name="SUN">"日"</string>
<string name="strAdd">"レシピを追加しましょう!"</string>
<string name="stp">"作り方"</string>
<string name="stars">"星評価"</string>
<string name="sru">"レシピを共有..."</string>
<string name="srt">"並び替え"</string>
<string name="srpu">"レシピの写真を共有..."</string>
<string name="_Sri_Lankan_Z7GfBa">"スリランカ料理"</string>
<string name="Spanish">"スペイン料理"</string>
<string name="Soups">"スープ"</string>
<string name="snacks">"軽食"</string>
<string name="sltd">"選択"</string>
<string name="_Slowest_first_hHjY6">"遅い順"</string>
<string name="simple">"シンプル"</string>
<string name="_Side_dishes_Z1Et4Vg">"副菜"</string>
<string name="shr">"共有"</string>
<string name="Settings">"設定"</string>
<string name="SET">"設定"</string>
<string name="Serving">"人前"</string>
<string name="ser">"検索"</string>
<string name="September">"9月"</string>
<string name="selRec">"レシピを選択"</string>
<string name="Seafood">"シーフード"</string>
<string name="Scottish">"スコットランド料理"</string>
<string name="Sauces">"ソース"</string>
<string name="SAT">"土"</string>
<string name="Salads">"サラダ"</string>
<string name="Russian">"ロシア料理"</string>
<string name="rst">"再起動"</string>
<string name="rp">"写真を削除"</string>
<string name="Roll">"ロール"</string>
<string name="rmYUInfo">"仕上がり分量の単位のリストから %1$s を削除しようとしています"</string>
<string name="rmUInfo">"単位のリストから %1$s を削除しようとしています"</string>
<string name="rmN">"メモが削除されました"</string>
<string name="rmIns">"作り方を削除しました"</string>
<string name="rmIng">"材料を削除しました"</string>
<string name="rmCuiInfo">"ジャンルのリストから %1$s を削除しようとしています"</string>
<string name="rmCmb">"組合せが削除されました"</string>
<string name="rmCatInfo">"カテゴリーのリストから %1$s を削除しようとしています"</string>
<string name="Rice">"お米料理"</string>
<string name="restYUL">"仕上がり分量の単位のリストをリセットする"</string>
<string name="restUL">"単位のリストをリセットする"</string>
<string name="restInfo">"リストをリセットすると、作成した項目が削除され、既定の項目を復元します。既にあるレシピには影響しません。"</string>
<string name="restDone">"リセットが完了しました"</string>
<string name="restCuiL">"ジャンルのリストをリセット"</string>
<string name="restCatL">"カテゴリーリストをリセット"</string>
<string name="rest">"リセット"</string>
<string name="resNF">"レシピが見つかりません"</string>
<string name="req">"%1$s が必要"</string>
<string name="recU">"アップデート:"</string>
<string name="recTitle">"私の健康レシピ"</string>
<string name="recs">"レシピ"</string>
<string name="recRm">"レシピを削除しました"</string>
<string name="recPic">"レシピの写真"</string>
<string name="recListEmp">"まだ何もありません!レシピを追加してもう一度試してください"</string>
<string name="recI">"インポートしました:"</string>
<string name="recF">"件のレシピが見つかりました"</string>
<string name="recE">"既に存在します:"</string>
<string name="rec">"レシピ"</string>
<string name="rBtn">"削除"</string>
<string name="Rating">"評価"</string>
<string name="_Quickest_first_Z1CpP7N">"速いもの順"</string>
<string name="qt">"クォート"</string>
<string name="pt">"少々"</string>
<string name="priv">"プライバシーポリシー"</string>
<string name="prepT">"準備時間"</string>
<string name="Pound">"ポンド"</string>
<string name="Poultry">"チキン料理"</string>
<string name="Portuguese">"ポルトガル料理"</string>
<string name="plsAdd">"プラスボタンを押して追加します"</string>
<string name="planner">"献立プラン"</string>
<string name="Piece">"片"</string>
<string name="piece">"片"</string>
<string name="pht">"レシピの写真"</string>
<string name="photogrid">"写真グリッド"</string>
<string name="Patty">"パティ"</string>
<string name="Pasta">"パスタ"</string>
<string name="Ounce">"オンス"</string>
<string name="opts">"オプション"</string>
<string name="_Oldest_first_Z6cq4h">"古いもの順"</string>
<string name="OK">"OK"</string>
<string name="October">"10月"</string>
<string name="nwYiU">"新しい仕上がり単位"</string>
<string name="nwCat">"新しいカテゴリー"</string>
<string name="November">"11月"</string>
<string name="nos">"メモ"</string>
<string name="noRecsInL">"検索に一致するレシピが見つかりませんでした"</string>
<string name="noRecs">"検索に一致するレシピがありません"</string>
<string name="Noodles">"麺"</string>
<string name="noFavs">"お気に入りはまだありません"</string>
<string name="noAccSensor">"加速度センサーが無効です"</string>
<string name="no">"メモ"</string>
<string name="nLangInfo">"新しい言語を使用するためにEnRecipesを再起動"</string>
<string name="Nigerian">"ナイジェリア料理"</string>
<string name="newUnit">"新しい単位"</string>
<string name="newRec">"新しいレシピ"</string>
<string name="_Newest_first_2Sb3c">"新しい順"</string>
<string name="newCui">"新しいジャンル"</string>
<string name="MON">"月"</string>
<string name="Moderate">"普通"</string>
<string name="ml">"ml"</string>
<string name="minimal">"最小"</string>
<string name="min">"分"</string>
<string name="Millilitre">"ミリリットル"</string>
<string name="mg">"mg"</string>
<string name="Mexican">"メキシコ料理"</string>
<string name="Meat">"肉料理"</string>
<string name="May">"5月"</string>
<string name="March">"3月"</string>
<string name="_Main_dishes_u6RGQ">"主菜"</string>
<string name="mAgo">"%1$s か月前"</string>
<string name="lunch">"昼食"</string>
<string name="ltAgo">"ずっと前"</string>
<string name="Loaf">"ローフ"</string>
<string name="Litre">"リットル"</string>
<string name="listVM">"一覧の表示方法"</string>
<string name="Light">"ライト"</string>
<string name="leaf">"枚"</string>
<string name="_Last_updated_Z2gEbLD">"最終更新"</string>
<string name="lang">"言語"</string>
<string name="l">"リットル"</string>
<string name="Korean">"韓国料理"</string>
<string name="Kilogram">"キログラム"</string>
<string name="kg">"kg"</string>
<string name="Kenyan">"ケニア料理"</string>
<string name="kEdit">"編集を続ける"</string>
<string name="June">"6月"</string>
<string name="July">"7月"</string>
<string name="joinTG">"Telegramグループに参加"</string>
<string name="Jewish">"ユダヤ料理"</string>
<string name="Japanese">"和食"</string>
<string name="January">"1月"</string>
<string name="Jamaican">"ジャマイカ料理"</string>
<string name="Italian">"イタリア料理"</string>
<string name="Irish">"アイルランド料理"</string>
<string name="invFile">"無効なファイルです"</string>
<string name="intf">"インターフェイス"</string>
<string name="inss">"作り方"</string>
<string name="ings">"材料"</string>
<string name="Indian">"インド料理"</string>
<string name="impSuc">"インポートに成功"</string>
<string name="impip">"インポートを実行中"</string>
<string name="impInfo">"アプリからエクスポートしたフルバックアップに対応しています"</string>
<string name="impFail">"インポートに失敗"</string>
<string name="impBu">"データをインポート"</string>
<string name="hr">"時間"</string>
<string name="Healthy">"ヘルシー"</string>
<string name="guide">"ユーザーガイド"</string>
<string name="grocery">"食材のリスト"</string>
<string name="grid">"グリッド"</string>
<string name="Greek">"ギリシャ料理"</string>
<string name="Gram">"グラム"</string>
<string name="gh">"GitHubで見る"</string>
<string name="German">"ドイツ料理"</string>
<string name="Gallon">"ガロン"</string>
<string name="gal">"ガロン"</string>
<string name="g">"g"</string>
<string name="fsList">"お気に入りのレシピはここに表示されます"</string>
<string name="FRI">"金"</string>
<string name="French">"フランス料理"</string>
<string name="_Fluid_Ounce_bd10L">"液量オンス"</string>
<string name="fltr">"絞り込み"</string>
<string name="_fl_oz_72kqu">"液量オンス"</string>
<string name="_Filtered_recipes_Z1alhhu">"絞り込み結果"</string>
<string name="Filipino">"フィリピン料理"</string>
<string name="February">"2月"</string>
<string name="favourites">"お気に入り"</string>
<string name="expSuc">"エクスポートに成功"</string>
<string name="expip">"エクスポートを実行中"</string>
<string name="expBu">"バックアップをエクスポート"</string>
<string name="English">"イングランド料理"</string>
<string name="Egyptian">"エジプト料理"</string>
<string name="editRec">"レシピを編集する"</string>
<string name="Easy">"簡単"</string>
<string name="dsp">"デザート用スプーン"</string>
<string name="drop">"滴"</string>
<string name="dozen">"ダース"</string>
<string name="donate">"寄付する"</string>
<string name="disc">"レシピの変更が保存されていません。どうしますか?"</string>
<string name="disBtn">"破棄"</string>
<string name="dinner">"夕食"</string>
<string name="_Difficulty_level_cSL5d">"難易度"</string>
<string name="detailed">"詳細"</string>
<string name="Desserts">"デザート"</string>
<string name="delRecsInfo">"%1$s 件のレシピを削除しようとしています"</string>
<string name="delRecInfo">"レシピ %1$s を削除しようとしています"</string>
<string name="December">"12月"</string>
<string name="dBtn">"削除"</string>
<string name="db">"データベース"</string>
<string name="Dark">"ダーク"</string>
<string name="Danish">"デンマーク料理"</string>
<string name="dAgo">"%1$s 日前"</string>
<string name="Cup">"カップ"</string>
<string name="cup">"カップ"</string>
<string name="cui">"ジャンル"</string>
<string name="Created">"作成日時"</string>
<string name="cPic">"写真を切り抜く"</string>
<string name="cookT">"調理時間"</string>
<string name="conf">"確認"</string>
<string name="conBtn">"続ける"</string>
<string name="cmbs">"組合せ"</string>
<string name="cm">"cm"</string>
<string name="clove">"クローブ"</string>
<string name="Chinese">"中華料理"</string>
<string name="Challenging">"難しい"</string>
<string name="cBtn">"キャンセル"</string>
<string name="cat">"カテゴリー"</string>
<string name="buMod">"バックアップファイルが一部修正されています"</string>
<string name="buInfo">"全てのデータを復元するためのZIPファイルを生成します"</string>
<string name="buInc">"バックアップファイルが壊れています"</string>
<string name="buFol">"バックアップフォルダー"</string>
<string name="buEmp">"バックアップファイルが空です"</string>
<string name="British">"イギリス料理"</string>
<string name="breakfast">"朝食"</string>
<string name="Breads">"パン"</string>
<string name="Brazilian">"ブラジル料理"</string>
<string name="Black">"黒"</string>
<string name="Beverages">"飲物"</string>
<string name="Barbecue">"キャンプ料理"</string>
<string name="August">"8月"</string>
<string name="aStpBtn">"手順を追加"</string>
<string name="April">"4月"</string>
<string name="appRst">"アプリの再起動が必要"</string>
<string name="apply">"適用する"</string>
<string name="appInfo">"EnRecipesはレシピを作成・管理・共有することができる、オープンソースでプライバシーに配慮したデジタル料理本です"</string>
<string name="Appetizers">"前菜"</string>
<string name="appCrd">"EnRecipesから共有されました。F-DroidかIzzyOnDroidかPlayストアからダウンロード出来ます。"</string>
<string name="aNoBtn">"メモを追加"</string>
<string name="aNBtn">"新しく追加"</string>
<string name="American">"アメリカ料理"</string>
<string name="allTs">"全てのタグ"</string>
<string name="allCuis">"全てのジャンル"</string>
<string name="allCats">"全てのカテゴリー"</string>
<string name="aIngBtn">"材料を追加"</string>
<string name="aFBu">"バックアップするにはレシピを登録してください"</string>
<string name="addCmbBtn">"組合せを追加"</string>
<string name="aD">"完了しました!"</string>
<string name="aBtn">"追加"</string>
<string name="About">"アプリについて"</string>
<string name="aap">"写真を添付"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
<string name="seconds">"seconds"</string>
<string name="hours">"hours"</string>
<string name="hour">"hour"</string>
<string name="minutes">"minutes"</string>
<string name="minute">"minute"</string>
<string name="dlyDur">"Delay duration"</string>
<string name="tmrvbrt">"Timer vibrate"</string>
<string name="tmrSnd">"Timer sound"</string>
<string name="aTPrst">"Added to presets"</string>
<string name="fwr">"for which recipe?"</string>
<string name="tmrPrsts">"Timer presets"</string>
<string name="prstBtn">"PRESETS"</string>
<string name="tmr">"Timer %1$s"</string>
<string name="delay">"Delay"</string>
<string name="stop">"Stop"</string>
<string name="strtBtn">"START"</string>
<string name="ntmr">"New timer"</string>
<string name="timer">"Cooking Timer"</string>
<string name="sec">"sec"</string>
<string name="EnRecipes">"EnRecipes"</string>
<string name="_app_name_1k3Sbz">"EnRecipes"</string>
<string name="app_name">"EnRecipes"</string>
<string name="title_activity_kimera">"EnRecipes"</string>
<string name="tmrClr">"tmrClr"</string>
</resources>

View file

@ -0,0 +1,318 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
<string name="seconds">"seconds"</string>
<string name="hours">"hours"</string>
<string name="hour">"hour"</string>
<string name="minutes">"minutes"</string>
<string name="minute">"minute"</string>
<string name="dlyDur">"Delay duration"</string>
<string name="tmrvbrt">"Timer vibrate"</string>
<string name="tmrSnd">"Timer sound"</string>
<string name="aTPrst">"Added to presets"</string>
<string name="fwr">"for which recipe?"</string>
<string name="tmrPrsts">"Timer presets"</string>
<string name="prstBtn">"PRESETS"</string>
<string name="tmr">"Timer %1$s"</string>
<string name="delay">"Delay"</string>
<string name="stop">"Stop"</string>
<string name="strtBtn">"START"</string>
<string name="ntmr">"New timer"</string>
<string name="timer">"Cooking Timer"</string>
<string name="sysDefB">"System default + Black"</string>
<string name="buto">"Backed up to %1$s"</string>
<string name="yld">"Yield"</string>
<string name="yieldU">"Yield unit"</string>
<string name="yieldQ">"Yield quantity"</string>
<string name="yesterday">"yesterday"</string>
<string name="WED">"WED"</string>
<string name="wAgo">"%1$s weeks ago"</string>
<string name="Vietnamese">"Vietnamese"</string>
<string name="Vegetarian">"Vegetarian"</string>
<string name="Vegan">"Vegan"</string>
<string name="untRec">"Untitled Recipe"</string>
<string name="unsaved">"Unsaved changes"</string>
<string name="Unit">"Unit"</string>
<string name="unit">"unit"</string>
<string name="Undefined">"Undefined"</string>
<string name="Turkish">"Turkish"</string>
<string name="TUE">"TUE"</string>
<string name="tsp">"tsp"</string>
<string name="tsInfo">"separate with spaces"</string>
<string name="ts">"Tags"</string>
<string name="trySer">"SEARCH IN ALL THE RECIPES?"</string>
<string name="trylater">"Try Later"</string>
<string name="trnsl">"Translate"</string>
<string name="triedInfo">"You tried this recipe %1$s"</string>
<string name="today">"today"</string>
<string name="tLInfo">"Recipes you want to try later are listed here"</string>
<string name="title">"Title"</string>
<string name="THU">"THU"</string>
<string name="Theme">"Theme"</string>
<string name="Thai">"Thai"</string>
<string name="Teaspoon">"Teaspoon"</string>
<string name="tbsp">"tbsp"</string>
<string name="Tablespoon">"Tablespoon"</string>
<string name="sysDef">"System default"</string>
<string name="swm">"Start week on Monday"</string>
<string name="Swedish">"Swedish"</string>
<string name="sVwInfo">"Helps you choose what to cook when you can\'t decide"</string>
<string name="sVw">"Shake to view random recipe"</string>
<string name="SUN">"SUN"</string>
<string name="strAdd">"Start adding your recipes!"</string>
<string name="stp">"Step"</string>
<string name="stick">"stick"</string>
<string name="stars">"Star rating"</string>
<string name="sru">"Share recipe using..."</string>
<string name="srt">"Sort"</string>
<string name="srpu">"Share recipe photo using..."</string>
<string name="_Sri_Lankan_Z7GfBa">"Sri Lankan"</string>
<string name="Spanish">"Spanish"</string>
<string name="Soups">"Soups"</string>
<string name="snacks">"Snacks"</string>
<string name="small">"small"</string>
<string name="sltd">"selected"</string>
<string name="_Slowest_first_hHjY6">"Slowest first"</string>
<string name="simple">"Simple"</string>
<string name="_Side_dishes_Z1Et4Vg">"Side dishes"</string>
<string name="shr">"Share"</string>
<string name="Settings">"Settings"</string>
<string name="SET">"SET"</string>
<string name="Serving">"Serving"</string>
<string name="ser">"Search"</string>
<string name="September">"September"</string>
<string name="selRec">"Select recipe"</string>
<string name="Seafood">"Seafood"</string>
<string name="Scottish">"Scottish"</string>
<string name="Sauces">"Sauces"</string>
<string name="SAT">"SAT"</string>
<string name="Salads">"Salads"</string>
<string name="Russian">"Russian"</string>
<string name="rst">"RESTART"</string>
<string name="rp">"Remove photo"</string>
<string name="Roll">"Roll"</string>
<string name="rmYUInfo">"You are about to remove %1$s from the yield unit list"</string>
<string name="rmUInfo">"You are about to remove %1$s from the unit list"</string>
<string name="rmN">"Note removed"</string>
<string name="rmIns">"Instruction removed"</string>
<string name="rmIng">"Ingredient removed"</string>
<string name="rmCuiInfo">"You are about to remove %1$s from the cuisine list"</string>
<string name="rmCmb">"Combination removed"</string>
<string name="rmCatInfo">"You are about to remove %1$s from the category list"</string>
<string name="Rice">"Rice"</string>
<string name="restYUL">"Reset yield unit list"</string>
<string name="restUL">"Reset unit list"</string>
<string name="restInfo">"Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."</string>
<string name="restDone">"Reset done"</string>
<string name="restCuiL">"Reset cuisine list"</string>
<string name="restCatL">"Reset category list"</string>
<string name="rest">"Reset"</string>
<string name="resNF">"Recipe not found"</string>
<string name="req">"Required %1$s"</string>
<string name="recU">"Updated:"</string>
<string name="recTitle">"My Healthy Recipe"</string>
<string name="recs">"recipes"</string>
<string name="recRm">"Recipe removed"</string>
<string name="recPic">"Recipe photo"</string>
<string name="recListEmp">"Nothing here! Add some recipes and try again"</string>
<string name="recI">"Imported:"</string>
<string name="recF">"recipes found"</string>
<string name="recE">"Already exist:"</string>
<string name="rec">"Recipe"</string>
<string name="rBtn">"REMOVE"</string>
<string name="Rating">"Rating"</string>
<string name="_Quickest_first_Z1CpP7N">"Quickest first"</string>
<string name="qt">"qt"</string>
<string name="pt">"pt"</string>
<string name="priv">"Privacy policy"</string>
<string name="prepT">"Preparation time"</string>
<string name="Pound">"Pound"</string>
<string name="Poultry">"Poultry"</string>
<string name="Portuguese">"Portuguese"</string>
<string name="plsAdd">"Use the plus button to add one"</string>
<string name="planner">"Meal Planner"</string>
<string name="pinch">"pinch"</string>
<string name="Piece">"Piece"</string>
<string name="piece">"piece"</string>
<string name="pht">"Recipe photo"</string>
<string name="photogrid">"Photo Grid"</string>
<string name="Patty">"Patty"</string>
<string name="Pasta">"Pasta"</string>
<string name="oz">"oz"</string>
<string name="Ounce">"Ounce"</string>
<string name="opts">"Options"</string>
<string name="_Oldest_first_Z6cq4h">"Oldest first"</string>
<string name="OK">"OK"</string>
<string name="October">"October"</string>
<string name="nwYiU">"New yield unit"</string>
<string name="nwCat">"New category"</string>
<string name="November">"November"</string>
<string name="nos">"Notes"</string>
<string name="noRecsInL">"None of the recipes here matches your search"</string>
<string name="noRecs">"No recipes match your search"</string>
<string name="Noodles">"Noodles"</string>
<string name="noFavs">"No favourites yet"</string>
<string name="noAccSensor">"Accelerometer sensor is either disabled or is not working"</string>
<string name="no">"Note"</string>
<string name="nNBtn">"NOT NOW"</string>
<string name="nLangInfo">"Restart EnRecipes to use the new language"</string>
<string name="Nigerian">"Nigerian"</string>
<string name="newUnit">"New unit"</string>
<string name="newRec">"New recipe"</string>
<string name="_Newest_first_2Sb3c">"Newest first"</string>
<string name="newCui">"New cuisine"</string>
<string name="MON">"MON"</string>
<string name="Moderate">"Moderate"</string>
<string name="ml">"ml"</string>
<string name="minimal">"Minimal"</string>
<string name="sec">"sec"</string>
<string name="min">"min"</string>
<string name="Millilitre">"Millilitre"</string>
<string name="mg">"mg"</string>
<string name="Mexican">"Mexican"</string>
<string name="medium">"medium"</string>
<string name="Meat">"Meat"</string>
<string name="May">"May"</string>
<string name="March">"March"</string>
<string name="_Main_dishes_u6RGQ">"Main dishes"</string>
<string name="mAgo">"%1$s months ago"</string>
<string name="lunch">"Lunch"</string>
<string name="ltAgo">"a long time ago"</string>
<string name="Loaf">"Loaf"</string>
<string name="Litre">"Litre"</string>
<string name="listVM">"List view mode"</string>
<string name="Light">"Light"</string>
<string name="leaf">"leaf"</string>
<string name="lb">"lb"</string>
<string name="_Last_updated_Z2gEbLD">"Last updated"</string>
<string name="large">"large"</string>
<string name="lang">"Language"</string>
<string name="l">"l"</string>
<string name="Korean">"Korean"</string>
<string name="Kilogram">"Kilogram"</string>
<string name="kg">"kg"</string>
<string name="Kenyan">"Kenyan"</string>
<string name="kEdit">"KEEP EDITING"</string>
<string name="June">"June"</string>
<string name="July">"July"</string>
<string name="joinTG">"Join the Telegram group"</string>
<string name="Jewish">"Jewish"</string>
<string name="Japanese">"Japanese"</string>
<string name="January">"January"</string>
<string name="Jamaican">"Jamaican"</string>
<string name="Italian">"Italian"</string>
<string name="it">"Item"</string>
<string name="Irish">"Irish"</string>
<string name="invFile">"Invalid file"</string>
<string name="intf">"Interface"</string>
<string name="inss">"Instructions"</string>
<string name="ings">"Ingredients"</string>
<string name="Indian">"Indian"</string>
<string name="in">"in"</string>
<string name="impSuc">"Import success"</string>
<string name="impip">"Import in progress"</string>
<string name="impInfo">"Supports full backups exported by this app"</string>
<string name="impFail">"Import failed"</string>
<string name="impBu">"Import data"</string>
<string name="hr">"hr"</string>
<string name="Healthy">"Healthy"</string>
<string name="guide">"User guide"</string>
<string name="grocery">"Grocery List"</string>
<string name="grid">"Grid"</string>
<string name="Greek">"Greek"</string>
<string name="Gram">"Gram"</string>
<string name="gh">"View on GitHub"</string>
<string name="German">"German"</string>
<string name="Gallon">"Gallon"</string>
<string name="gal">"gal"</string>
<string name="g">"g"</string>
<string name="fsList">"Your favourite recipes are listed here"</string>
<string name="FRI">"FRI"</string>
<string name="French">"French"</string>
<string name="_Fluid_Ounce_bd10L">"Fluid Ounce"</string>
<string name="fltr">"Filter"</string>
<string name="_fl_oz_72kqu">"fl oz"</string>
<string name="_Filtered_recipes_Z1alhhu">"Filtered recipes"</string>
<string name="Filipino">"Filipino"</string>
<string name="February">"February"</string>
<string name="favourites">"Favourites"</string>
<string name="expSuc">"Export success"</string>
<string name="expip">"Export in progress"</string>
<string name="expBu">"Export full backup"</string>
<string name="EnRecipes">"EnRecipes"</string>
<string name="English">"English"</string>
<string name="Egyptian">"Egyptian"</string>
<string name="editRec">"Edit recipe"</string>
<string name="Easy">"Easy"</string>
<string name="dsp">"dstspn"</string>
<string name="drop">"drop"</string>
<string name="dozen">"dozen"</string>
<string name="donate">"Donate"</string>
<string name="disc">"This recipe has unsaved changes. What would you like to do?"</string>
<string name="disBtn">"DISCARD"</string>
<string name="dinner">"Dinner"</string>
<string name="_Difficulty_level_cSL5d">"Difficulty level"</string>
<string name="detailed">"Detailed"</string>
<string name="Desserts">"Desserts"</string>
<string name="delRecsInfo">"You are about to permanently delete %1$s"</string>
<string name="delRecInfo">"You are about to permanently delete the recipe %1$s"</string>
<string name="December">"December"</string>
<string name="dBtn">"DELETE"</string>
<string name="db">"Database"</string>
<string name="Dark">"Dark"</string>
<string name="Danish">"Danish"</string>
<string name="dAgo">"%1$s days ago"</string>
<string name="Cup">"Cup"</string>
<string name="cup">"cup"</string>
<string name="cui">"Cuisine"</string>
<string name="Created">"Created"</string>
<string name="cPic">"Crop photo"</string>
<string name="cookT">"Cooking time"</string>
<string name="conf">"Confirm"</string>
<string name="conBtn">"CONTINUE"</string>
<string name="cmbs">"Combinations"</string>
<string name="cm">"cm"</string>
<string name="clove">"clove"</string>
<string name="Chinese">"Chinese"</string>
<string name="Challenging">"Challenging"</string>
<string name="cBtn">"CANCEL"</string>
<string name="cat">"Category"</string>
<string name="buMod">"The backup file was modified elsewhere"</string>
<string name="buInfo">"Generates a ZIP file containing all your data that can be imported back"</string>
<string name="buInc">"Malformed or corrupt backup file"</string>
<string name="buFol">"Backup folder"</string>
<string name="buEmp">"The backup file is empty"</string>
<string name="British">"British"</string>
<string name="breakfast">"Breakfast"</string>
<string name="Breads">"Breads"</string>
<string name="Brazilian">"Brazilian"</string>
<string name="Black">"Black"</string>
<string name="Beverages">"Beverages"</string>
<string name="Barbecue">"Barbecue"</string>
<string name="August">"August"</string>
<string name="aStpBtn">"ADD STEP"</string>
<string name="April">"April"</string>
<string name="appRst">"App restart required"</string>
<string name="apply">"APPLY"</string>
<string name="appInfo">"EnRecipes is an open source, privacy-friendly digital cookbook that lets you create, manage and share your recipes"</string>
<string name="Appetizers">"Appetizers"</string>
<string name="appCrd">"Shared via EnRecipes. Get it on F-Droid, IzzyOnDroid or the Play Store."</string>
<string name="_app_name_1k3Sbz">"EnRecipes"</string>
<string name="app_name">"EnRecipes"</string>
<string name="title_activity_kimera">"EnRecipes"</string>
<string name="aNoBtn">"ADD NOTE"</string>
<string name="aNBtn">"ADD NEW"</string>
<string name="American">"American"</string>
<string name="allTs">"All Tags"</string>
<string name="allCuis">"All Cuisines"</string>
<string name="allCats">"All Categories"</string>
<string name="aIngBtn">"ADD INGREDIENT"</string>
<string name="aFBu">"Add a recipe to perform a backup"</string>
<string name="addCmbBtn">"ADD COMBINATION"</string>
<string name="aD">"All done!"</string>
<string name="aBtn">"ADD"</string>
<string name="About">"About"</string>
<string name="aap">"Attach a photo"</string>
<string name="tmrClr">"tmrClr"</string>
</resources>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="sysDefB">"സിസ്റ്റം സ്ഥിരസ്ഥിതി + കറുപ്പ്"</string>
<string name="buto">"%1$s ലേക്ക് ബാക്കപ്പ് ചെയ്തു"</string>
<string name="yld">"വരുമാനം"</string>
<string name="yieldU">"വിളവ് യൂണിറ്റ്"</string>
@ -292,4 +293,26 @@
<string name="aBtn">"ചേർക്കുക"</string>
<string name="About">"കുറിച്ച്"</string>
<string name="aap">"ഒരു ഫോട്ടോ അറ്റാച്ചുചെയ്യുക"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
<string name="seconds">"seconds"</string>
<string name="hours">"hours"</string>
<string name="hour">"hour"</string>
<string name="minutes">"minutes"</string>
<string name="minute">"minute"</string>
<string name="dlyDur">"Delay duration"</string>
<string name="tmrvbrt">"Timer vibrate"</string>
<string name="tmrSnd">"Timer sound"</string>
<string name="aTPrst">"Added to presets"</string>
<string name="fwr">"for which recipe?"</string>
<string name="tmrPrsts">"Timer presets"</string>
<string name="prstBtn">"PRESETS"</string>
<string name="tmr">"Timer %1$s"</string>
<string name="delay">"Delay"</string>
<string name="stop">"Stop"</string>
<string name="strtBtn">"START"</string>
<string name="ntmr">"New timer"</string>
<string name="timer">"Cooking Timer"</string>
<string name="sec">"sec"</string>
<string name="tmrClr">"tmrClr"</string>
</resources>

View file

@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="sec">"s"</string>
<string name="sysDefB">"Systemforvalg + Svart"</string>
<string name="buto">"Støttet opp til %1$s"</string>
<string name="yld">"Nyttemengde"</string>
<string name="yieldU">"Enhet for nyttemengde"</string>
@ -292,4 +294,25 @@
<string name="aBtn">"Legg til"</string>
<string name="About">"Om"</string>
<string name="aap">"Legg ved et bilde"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
<string name="seconds">"seconds"</string>
<string name="hours">"hours"</string>
<string name="hour">"hour"</string>
<string name="minutes">"minutes"</string>
<string name="minute">"minute"</string>
<string name="dlyDur">"Delay duration"</string>
<string name="tmrvbrt">"Timer vibrate"</string>
<string name="tmrSnd">"Timer sound"</string>
<string name="aTPrst">"Added to presets"</string>
<string name="fwr">"for which recipe?"</string>
<string name="tmrPrsts">"Timer presets"</string>
<string name="prstBtn">"PRESETS"</string>
<string name="tmr">"Timer %1$s"</string>
<string name="delay">"Delay"</string>
<string name="stop">"Stop"</string>
<string name="strtBtn">"START"</string>
<string name="ntmr">"New timer"</string>
<string name="timer">"Cooking Timer"</string>
<string name="tmrClr">"tmrClr"</string>
</resources>

View file

@ -2,13 +2,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
<style name="LaunchScreenThemeBase" parent="Theme.AppCompat.NoActionBar">
<item name="colorPrimary">
@color/dark
</item>
<item name="colorPrimaryDark">
@color/dark
</item>
<item name="colorAccent">
@color/dark
@color/orange
</item>
<item name="android:windowBackground">
@drawable/splash_screen_dark
@ -16,6 +10,9 @@
<item name="android:windowLightStatusBar">
false
</item>
<item name="android:statusBarColor">
@color/dark
</item>
<item name="android:windowLightNavigationBar" tools:targetApi="27">
false
</item>
@ -26,30 +23,38 @@
<style name="LaunchScreenTheme" parent="LaunchScreenThemeBase">
</style>
<style name="AppThemeBase" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">
@color/dark
</item>
<item name="colorPrimaryDark">
@color/dark
</item>
<item name="colorAccent">
@color/dark
@color/orange
</item>
<item name="colorControlNormal">
#00000000
</item>
</style>
<style name="AppTheme" parent="AppThemeBase">
<item name="android:listViewStyle">@style/ListViewTheme</item>
<item name="android:scrollViewStyle">@style/ScrollViewTheme</item>
<item name="android:listViewStyle">
@style/ListViewTheme
</item>
<item name="android:scrollViewStyle">
@style/ScrollViewTheme
</item>
</style>
<style name="ListViewTheme" parent="android:Widget.ListView">
<item name="android:overScrollMode">never</item>
<item name="android:divider">#00000000</item>
<item name="android:dividerHeight">0dp</item>
<item name="android:listSelector">#00000000</item>
<item name="android:overScrollMode">
never
</item>
<item name="android:divider">
#00000000
</item>
<item name="android:dividerHeight">
0dp
</item>
<item name="android:listSelector">
#00000000
</item>
</style>
<style name="ScrollViewTheme" parent="android:Widget.ScrollView">
<item name="android:overScrollMode">never</item>
<item name="android:overScrollMode">
never
</item>
</style>
</resources>

View file

@ -1,5 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tmrClr">"Kookwekker gewist"</string>
<string name="delay">"Vertraging"</string>
<string name="dlyDur">"Vertragingsduur"</string>
<string name="minute">"minuut"</string>
<string name="minutes">"minuten"</string>
<string name="hour">"uur"</string>
<string name="hours">"uur"</string>
<string name="seconds">"seconden"</string>
<string name="tmrvbrt">"Kookwekker laten trillen"</string>
<string name="stop">"Stoppen"</string>
<string name="prstBtn">"VOORINSTELLINGEN"</string>
<string name="tmrPrsts">"Kookwekker: voorinstellingen"</string>
<string name="fwr">"bij welk recept?"</string>
<string name="aTPrst">"Toegevoegd aan voorinstellingen"</string>
<string name="tmrSnd">"Kookwekkergeluid"</string>
<string name="sec">"s"</string>
<string name="timer">"Kookwekker"</string>
<string name="ntmr">"Nieuwe kookwekker"</string>
<string name="strtBtn">"STARTEN"</string>
<string name="tmr">"Kookwekker %1$s"</string>
<string name="sysDefB">"Systeemthema + Zwart"</string>
<string name="buto">"Gebackupt naar %1$s"</string>
<string name="yld">"Hoeveelheid"</string>
<string name="yieldU">"Eenheid"</string>
@ -292,4 +313,6 @@
<string name="aBtn">"TOEVOEGEN"</string>
<string name="About">"Over"</string>
<string name="aap">"Foto bijvoegen"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -1,5 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tmrClr">"Temporizador liberado"</string>
<string name="seconds">"segundos"</string>
<string name="hours">"horas"</string>
<string name="hour">"hora"</string>
<string name="minutes">"atas"</string>
<string name="minute">"minuto"</string>
<string name="dlyDur">"Duração do atraso"</string>
<string name="tmrvbrt">"Temporizador vibrar"</string>
<string name="tmrSnd">"Som temporizador"</string>
<string name="aTPrst">"Adicionado às predefinições"</string>
<string name="fwr">"para qual receita?"</string>
<string name="tmrPrsts">"Predefinições temporizadas"</string>
<string name="delay">"Atraso"</string>
<string name="stop">"Parada"</string>
<string name="sec">"s"</string>
<string name="prstBtn">"PERSPECTIVAS"</string>
<string name="timer">"Temporizador de Culinária"</string>
<string name="ntmr">"Novo timer"</string>
<string name="strtBtn">"INICIAR"</string>
<string name="tmr">"Temporizador %1$s"</string>
<string name="dAgo">"%1$s dias atrás"</string>
<string name="Filipino">"Filipina"</string>
<string name="mAgo">"%1$s meses atrás"</string>
<string name="Thai">"Tailandesa"</string>
<string name="wAgo">"%1$s semanas atrás"</string>
<string name="sysDefB">"Padrão do sistema + Preto"</string>
<string name="yld">"Porção"</string>
<string name="Jewish">"Judeu"</string>
<string name="Japanese">"Japonês"</string>
<string name="January">"Janeiro"</string>
@ -70,7 +97,7 @@
<string name="restDone">"Reposição feita"</string>
<string name="restInfo">"A redefinição de uma lista eliminará as entradas criadas pelo usuário e restaurará as entradas padrão. As receitas existentes não serão afetadas."</string>
<string name="restUL">"Reiniciar a lista de unidades"</string>
<string name="restYUL">"Redefinir a lista de unidades de rendimento"</string>
<string name="restYUL">"Redefinir a lista de unidades de porção"</string>
<string name="rmCmb">"Combinação removida"</string>
<string name="rmIng">"Ingrediente removido"</string>
<string name="rmIns">"Instrução retirada"</string>
@ -114,7 +141,7 @@
<string name="_Oldest_first_Z6cq4h">"Os mais antigos"</string>
<string name="OK">"OK"</string>
<string name="October">"Outubro"</string>
<string name="nwYiU">"Nova unidade de produção"</string>
<string name="nwYiU">"Nova unidade de porção"</string>
<string name="nwCat">"Nova categoria"</string>
<string name="noRecsInL">"Nenhuma das receitas aqui corresponde à sua busca"</string>
<string name="noAccSensor">"O sensor do acelerômetro está desativado ou não está funcionando"</string>
@ -143,8 +170,8 @@
<string name="WED">"VIA"</string>
<string name="FRI">"SEX"</string>
<string name="MON">"SEG"</string>
<string name="yieldU">"Unidade de rendimento"</string>
<string name="yieldQ">"Quantidade de rendimento"</string>
<string name="yieldU">"Unidade de porção"</string>
<string name="yieldQ">"Quantidade de porção"</string>
<string name="Vegetarian">"Vegetariano"</string>
<string name="Vegan">"Vegano"</string>
<string name="unit">"Unidade"</string>
@ -177,7 +204,7 @@
<string name="Salads">"Saladas"</string>
<string name="rst">"REINICIAR"</string>
<string name="Roll">"Lista"</string>
<string name="rmYUInfo">"Você está prestes a remover a unidade de rendimento"</string>
<string name="rmYUInfo">"Você está prestes a remover a unidade de porção"</string>
<string name="rmUInfo">"Você está prestes a remover a unidade"</string>
<string name="rmCuiInfo">"Você está prestes a remover a cozinha"</string>
<string name="rmCatInfo">"Você está prestes a remover a categoria"</string>
@ -286,10 +313,6 @@
<string name="aD">"Tudo feito!"</string>
<string name="aBtn">"ADICIONAR"</string>
<string name="About">"Sobre"</string>
<string name="yld">"Yield"</string>
<string name="wAgo">"%1$s weeks ago"</string>
<string name="Thai">"Thai"</string>
<string name="mAgo">"%1$s months ago"</string>
<string name="Filipino">"Filipino"</string>
<string name="dAgo">"%1$s days ago"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -1,5 +1,115 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tmrClr">"Temporizador a zero"</string>
<string name="prstBtn">"PRIMEIROS"</string>
<string name="tmrPrsts">"Predefinições temporizadas"</string>
<string name="fwr">"para que receita?"</string>
<string name="aTPrst">"Adicionado às predefinições"</string>
<string name="tmrSnd">"Som temporizador"</string>
<string name="tmrvbrt">"Vibrador temporizador"</string>
<string name="seconds">"segundos"</string>
<string name="hours">"horas"</string>
<string name="hour">"hora"</string>
<string name="minutes">"minutos"</string>
<string name="minute">"minuto"</string>
<string name="sec">"s"</string>
<string name="stop">"Parar"</string>
<string name="delay">"Atraso"</string>
<string name="dlyDur">"Duração do atraso"</string>
<string name="timer">"Temporizador de cozedura"</string>
<string name="ntmr">"Novo temporizador"</string>
<string name="strtBtn">"INICIAR"</string>
<string name="tmr">"Temporizador %1$s"</string>
<string name="aBtn">"ADICIONAR"</string>
<string name="aD">"Terminado!"</string>
<string name="addCmbBtn">"ADICIONAR COMBINAÇÃO"</string>
<string name="aFBu">"Adicione uma receita para fazer uma cópia de segurança"</string>
<string name="aIngBtn">"ADICIONAR INGREDIENTE"</string>
<string name="allCats">"Todas as categorias"</string>
<string name="allCuis">"Todas as cozinhas"</string>
<string name="allTs">"Todas as etiquetas"</string>
<string name="aNBtn">"ADICIONAR NOVA"</string>
<string name="aNoBtn">"ADICIONAR NOTA"</string>
<string name="appCrd">"Partilhado via EnRecipes. Obtenha-o no F-Droid, IzzyOnDroid ou na Play Store."</string>
<string name="appInfo">"EnRecipes é um livro de receitas digital de código aberto, amigo da privacidade, que lhe permite criar, gerir e partilhar as suas receitas"</string>
<string name="apply">"APLICAR"</string>
<string name="appRst">"É necessário reiniciar a aplicação"</string>
<string name="April">"Abril"</string>
<string name="aStpBtn">"ADICIONAR PASSO"</string>
<string name="August">"Agosto"</string>
<string name="cBtn">"CANCELAR"</string>
<string name="conBtn">"CONTINUAR"</string>
<string name="dBtn">"ELIMINAR"</string>
<string name="disBtn">"DESCARTAR"</string>
<string name="fsList">"As suas receitas favoritas são apresentadas aqui"</string>
<string name="gh">"Ver no GitHub"</string>
<string name="grid">"Grelha"</string>
<string name="guide">"Guia do utilizador"</string>
<string name="impBu">"Importar dados"</string>
<string name="impFail">"A importação falhou"</string>
<string name="impInfo">"Suporta cópias de segurança completas exportadas por esta aplicação"</string>
<string name="impip">"Importação em curso"</string>
<string name="impSuc">"Importado com sucesso"</string>
<string name="ings">"Ingredientes"</string>
<string name="inss">"Instruções"</string>
<string name="intf">"Interface"</string>
<string name="invFile">"Ficheiro inválido"</string>
<string name="it">"Item"</string>
<string name="January">"Janeiro"</string>
<string name="joinTG">"Junte-se ao grupo no Telegram"</string>
<string name="July">"Julho"</string>
<string name="June">"Junho"</string>
<string name="kEdit">"CONTINUAR A EDITAR"</string>
<string name="lang">"Idioma"</string>
<string name="listVM">"Modo de vista em lista"</string>
<string name="ltAgo">"há muito tempo"</string>
<string name="mAgo">"%1$s meses atrás"</string>
<string name="March">"Março"</string>
<string name="May">"Maio"</string>
<string name="minimal">"Mínimo"</string>
<string name="newCui">"Nova cozinha"</string>
<string name="newRec">"Nova receita"</string>
<string name="newUnit">"Nova unidade"</string>
<string name="nLangInfo">"Reinicie o EnRecipes para usar o novo idioma"</string>
<string name="nNBtn">"AGORA NÃO"</string>
<string name="no">"Nota"</string>
<string name="noFavs">"Ainda não tem favoritos"</string>
<string name="noRecs">"Nenhuma receita corresponde à pesquisa"</string>
<string name="pht">"Fotografia da receita"</string>
<string name="plsAdd">"Use o botão mais para adicionar uma"</string>
<string name="prepT">"Tempo de preparação"</string>
<string name="priv">"Política de privacidade"</string>
<string name="rBtn">"REMOVER"</string>
<string name="restInfo">"A redefinição de uma lista eliminará as entradas criadas pelo utilizador e restaurará as entradas predefinidas. As receitas existentes não serão afetadas."</string>
<string name="restUL">"Repor lista de unidades"</string>
<string name="restYUL">"Repor lista de unidades de porções"</string>
<string name="yld">"Porção"</string>
<string name="rmCmb">"Combinação removida"</string>
<string name="rmIng">"Ingrediente removido"</string>
<string name="rmIns">"Instrução removida"</string>
<string name="rmN">"Nota removida"</string>
<string name="rp">"Remover fotografia"</string>
<string name="rst">"REINICIAR"</string>
<string name="selRec">"Selecione a receita"</string>
<string name="September">"Setembro"</string>
<string name="ser">"Pesquisar"</string>
<string name="shr">"Partilhar"</string>
<string name="simple">"Simples"</string>
<string name="sltd">"selecionada"</string>
<string name="srpu">"Partilhar fotografia da receita usando..."</string>
<string name="srt">"Ordenar"</string>
<string name="sru">"Partilhar receita usando..."</string>
<string name="stars">"Classificação por estrelas"</string>
<string name="stp">"Etapa"</string>
<string name="trySer">"PROCURAR EM TODAS AS RECEITAS?"</string>
<string name="sysDefB">"Padrão do sistema + Preto"</string>
<string name="FRI">"SEX"</string>
<string name="MON">"SEG"</string>
<string name="SAT">"SÁB"</string>
<string name="SUN">"DOM"</string>
<string name="TUE">"TER"</string>
<string name="WED">"QUA"</string>
<string name="THU">"QUI"</string>
<string name="rec">"Receita"</string>
<string name="recE">"Já existem:"</string>
<string name="recF">"receitas encontradas"</string>
@ -9,20 +119,20 @@
<string name="recRm">"Receita retirada"</string>
<string name="recs">"receitas"</string>
<string name="recTitle">"A minha receita saudável"</string>
<string name="recU">"Actualizado:"</string>
<string name="recU">"Atualizado:"</string>
<string name="req">"Necessárias %1$s"</string>
<string name="resNF">"Receita não encontrada"</string>
<string name="rest">"Reiniciar"</string>
<string name="restCatL">"Reiniciar lista de categorias"</string>
<string name="restCuiL">"Repor a lista de cozinha"</string>
<string name="restDone">"Reposição feita"</string>
<string name="buto">"Replacement made"</string>
<string name="yieldQ">"Quantidade de produção"</string>
<string name="yieldU">"Unidade de rendimento"</string>
<string name="buto">"Cópia de segurança guardada em %1$s"</string>
<string name="yieldQ">"Quantidade da porção"</string>
<string name="yieldU">"Unidade de porção"</string>
<string name="Black">"Preto"</string>
<string name="buEmp">"O arquivo de backup está vazio"</string>
<string name="buFol">"Pasta de backup"</string>
<string name="buInc">"Ficheiro de backup malformado ou corrupto"</string>
<string name="buEmp">"O ficheiro da cópia de segurança está vazio"</string>
<string name="buFol">"Pasta da cópia de segurança"</string>
<string name="buInc">"Ficheiro da cópia de segurança está mal formado ou corrupto"</string>
<string name="buInfo">"Gera um ficheiro ZIP contendo todos os seus dados que podem ser importados de volta"</string>
<string name="buMod">"O ficheiro de cópia de segurança foi modificado noutro local"</string>
<string name="cat">"Categoria"</string>
@ -42,7 +152,7 @@
<string name="editRec">"Editar receita"</string>
<string name="expBu">"Exportar apoio total"</string>
<string name="expip">"Exportação em curso"</string>
<string name="expSuc">"Sucesso de exportação"</string>
<string name="expSuc">"Exportado com sucesso"</string>
<string name="February">"Fevereiro"</string>
<string name="_Filtered_recipes_Z1alhhu">"Receitas filtradas"</string>
<string name="fltr">"Filtro"</string>
@ -50,13 +160,13 @@
<string name="nos">"Notas"</string>
<string name="November">"Novembro"</string>
<string name="nwCat">"Nova categoria"</string>
<string name="nwYiU">"Nova unidade de rendimento"</string>
<string name="nwYiU">"Nova unidade de porção"</string>
<string name="October">"Outubro"</string>
<string name="opts">"Opções"</string>
<string name="photogrid">"Grelha de fotos"</string>
<string name="wAgo">"%1$s semanas atrás"</string>
<string name="untRec">"Receita sem título"</string>
<string name="unsaved">"Alterações não salvas"</string>
<string name="unsaved">"Alterações não guardadas"</string>
<string name="tsInfo">"separar com espaços"</string>
<string name="ts">"Etiquetas"</string>
<string name="trnsl">"Traduzir"</string>
@ -67,11 +177,11 @@
<string name="swm">"Começa na segunda-feira"</string>
<string name="sVwInfo">"Ajuda-o a escolher o que deve cozinhar quando não consegue decidir"</string>
<string name="sVw">"Sacudir para ver a receita aleatória"</string>
<string name="rmYUInfo">"Está prestes a remover %1$s da lista de unidades de rendimento"</string>
<string name="rmYUInfo">"Está prestes a remover %1$s da lista de unidades de porções"</string>
<string name="rmUInfo">"Está prestes a remover %1$s da lista de unidades"</string>
<string name="rmCuiInfo">"Está prestes a retirar %1$s da lista de cozinha"</string>
<string name="rmCatInfo">"Está prestes a remover %1$s da lista de categorias"</string>
<string name="noAccSensor">"O sensor do acelerómetro ou está desactivado ou não está a funcionar"</string>
<string name="noAccSensor">"O sensor do acelerómetro ou está desativado ou não está a funcionar"</string>
<string name="yesterday">"ontem"</string>
<string name="Vietnamese">"Vietnamita"</string>
<string name="Vegetarian">"Vegetariano"</string>
@ -81,7 +191,7 @@
<string name="Undefined">"Indefinido"</string>
<string name="Turkish">"Turca"</string>
<string name="tsp">"colher de chá"</string>
<string name="trylater">"Tente Mais Tarde"</string>
<string name="trylater">"Tentar mais tarde"</string>
<string name="today">"hoje"</string>
<string name="Theme">"Tema"</string>
<string name="Thai">"Tailandesa"</string>
@ -91,7 +201,7 @@
<string name="Swedish">"Sueca"</string>
<string name="strAdd">"Comece a adicionar as suas receitas!"</string>
<string name="stick">"galho"</string>
<string name="_Sri_Lankan_Z7GfBa">"Cingalês"</string>
<string name="_Sri_Lankan_Z7GfBa">"Cingalesa"</string>
<string name="Spanish">"Espanhola"</string>
<string name="Soups">"Sopas"</string>
<string name="snacks">"Lanches"</string>
@ -99,10 +209,10 @@
<string name="_Slowest_first_hHjY6">"Mais lentas primeiro"</string>
<string name="_Side_dishes_Z1Et4Vg">"Acompanhamentos"</string>
<string name="Settings">"Definições"</string>
<string name="SET">"SET"</string>
<string name="SET">"DEFINIR"</string>
<string name="Serving">"Porção"</string>
<string name="Seafood">"Marisco"</string>
<string name="Scottish">"Escocêsa"</string>
<string name="Scottish">"Escocesa"</string>
<string name="Sauces">"Molhos"</string>
<string name="Salads">"Saladas"</string>
<string name="Russian">"Russa"</string>
@ -115,7 +225,7 @@
<string name="Pound">"Pound"</string>
<string name="Poultry">"Aves"</string>
<string name="Portuguese">"Portuguesa"</string>
<string name="planner">"Plano Refeições"</string>
<string name="planner">"Plano de refeições"</string>
<string name="pinch">"pitada"</string>
<string name="Piece">"Peça"</string>
<string name="piece">"peça"</string>
@ -151,15 +261,15 @@
<string name="kg">"kg"</string>
<string name="Kenyan">"Queniana"</string>
<string name="Jewish">"Judaica"</string>
<string name="Japanese">"Japonêsa"</string>
<string name="Japanese">"Japonesa"</string>
<string name="Jamaican">"Jamaicana"</string>
<string name="Italian">"Italiana"</string>
<string name="Irish">"Irlândesa"</string>
<string name="Irish">"Irlandesa"</string>
<string name="Indian">"Indiana"</string>
<string name="in">"in"</string>
<string name="hr">"hr"</string>
<string name="Healthy">"Saudável"</string>
<string name="grocery">"Lista Supermercado"</string>
<string name="grocery">"Lista de compras"</string>
<string name="Greek">"Grega"</string>
<string name="Gram">"Grama"</string>
<string name="German">"Alemã"</string>
@ -167,12 +277,12 @@
<string name="gal">"gal"</string>
<string name="g">"g"</string>
<string name="French">"Francesa"</string>
<string name="_Fluid_Ounce_bd10L">"Onça Fluida"</string>
<string name="_Fluid_Ounce_bd10L">"Onça líquida"</string>
<string name="_fl_oz_72kqu">"fl oz"</string>
<string name="Filipino">"Filipina"</string>
<string name="favourites">"Favoritos"</string>
<string name="EnRecipes">"EnRecipes"</string>
<string name="English">"Inglêsa"</string>
<string name="English">"Inglesa"</string>
<string name="Egyptian">"Egípcia"</string>
<string name="Easy">"Fácil"</string>
<string name="dsp">"colher de sobremesa"</string>
@ -182,7 +292,7 @@
<string name="_Difficulty_level_cSL5d">"Nível de dificuldade"</string>
<string name="Desserts">"Sobremesas"</string>
<string name="Dark">"Escuro"</string>
<string name="Danish">"Dinamarquêsa"</string>
<string name="Danish">"Dinamarquesa"</string>
<string name="Cup">"Copo"</string>
<string name="cup">"copo"</string>
<string name="Created">"Criado"</string>
@ -202,94 +312,7 @@
<string name="title_activity_kimera">"EnRecipes"</string>
<string name="American">"Americana"</string>
<string name="About">"Sobre"</string>
<string name="aap">""</string>
<string name="yld">"Yield"</string>
<string name="WED">"WED"</string>
<string name="TUE">"TUE"</string>
<string name="trySer">"SEARCH IN ALL THE RECIPES?"</string>
<string name="THU">"THU"</string>
<string name="SUN">"SUN"</string>
<string name="stp">"Step"</string>
<string name="stars">"Star rating"</string>
<string name="sru">"Share recipe using..."</string>
<string name="srt">"Sort"</string>
<string name="srpu">"Share recipe photo using..."</string>
<string name="sltd">"selected"</string>
<string name="simple">"Simple"</string>
<string name="shr">"Share"</string>
<string name="ser">"Search"</string>
<string name="September">"September"</string>
<string name="selRec">"Select recipe"</string>
<string name="SAT">"SAT"</string>
<string name="rst">"RESTART"</string>
<string name="rp">"Remove photo"</string>
<string name="rmN">"Note removed"</string>
<string name="rmIns">"Instruction removed"</string>
<string name="rmIng">"Ingredient removed"</string>
<string name="rmCmb">"Combination removed"</string>
<string name="restYUL">"Reset yield unit list"</string>
<string name="restUL">"Reset unit list"</string>
<string name="restInfo">"Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."</string>
<string name="rBtn">"REMOVE"</string>
<string name="priv">"Privacy policy"</string>
<string name="prepT">"Preparation time"</string>
<string name="plsAdd">"Use the plus button to add one"</string>
<string name="pht">"Recipe photo"</string>
<string name="noRecs">"No recipes match your search"</string>
<string name="noFavs">"No favourites yet"</string>
<string name="no">"Note"</string>
<string name="nNBtn">"NOT NOW"</string>
<string name="nLangInfo">"Restart EnRecipes to use the new language"</string>
<string name="newUnit">"New unit"</string>
<string name="newRec">"New recipe"</string>
<string name="newCui">"New cuisine"</string>
<string name="MON">"MON"</string>
<string name="minimal">"Minimal"</string>
<string name="May">"May"</string>
<string name="March">"March"</string>
<string name="mAgo">"%1$s months ago"</string>
<string name="ltAgo">"a long time ago"</string>
<string name="listVM">"List view mode"</string>
<string name="lang">"Language"</string>
<string name="kEdit">"KEEP EDITING"</string>
<string name="June">"June"</string>
<string name="July">"July"</string>
<string name="joinTG">"Join the Telegram group"</string>
<string name="January">"January"</string>
<string name="it">"Item"</string>
<string name="invFile">"Invalid file"</string>
<string name="intf">"Interface"</string>
<string name="inss">"Instructions"</string>
<string name="ings">"Ingredients"</string>
<string name="impSuc">"Import success"</string>
<string name="impip">"Import in progress"</string>
<string name="impInfo">"Supports full backups exported by this app"</string>
<string name="impFail">"Import failed"</string>
<string name="impBu">"Import data"</string>
<string name="guide">"User guide"</string>
<string name="grid">"Grid"</string>
<string name="gh">"View on GitHub"</string>
<string name="fsList">"Your favourite recipes are listed here"</string>
<string name="FRI">"FRI"</string>
<string name="disBtn">"DISCARD"</string>
<string name="dBtn">"DELETE"</string>
<string name="conBtn">"CONTINUE"</string>
<string name="cBtn">"CANCEL"</string>
<string name="August">"August"</string>
<string name="aStpBtn">"ADD STEP"</string>
<string name="April">"April"</string>
<string name="appRst">"App restart required"</string>
<string name="apply">"APPLY"</string>
<string name="appInfo">"EnRecipes is an open source, privacy-friendly digital cookbook that lets you create, manage and share your recipes"</string>
<string name="appCrd">"Shared via EnRecipes. Get it on F-Droid, IzzyOnDroid or the Play Store."</string>
<string name="aNoBtn">"ADD NOTE"</string>
<string name="aNBtn">"ADD NEW"</string>
<string name="allTs">"All Tags"</string>
<string name="allCuis">"All Cuisines"</string>
<string name="allCats">"All Categories"</string>
<string name="aIngBtn">"ADD INGREDIENT"</string>
<string name="aFBu">"Add a recipe to perform a backup"</string>
<string name="addCmbBtn">"ADD COMBINATION"</string>
<string name="aD">"All done!"</string>
<string name="aBtn">"ADD"</string>
<string name="aap">"Anexar uma fotografia"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -1,5 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="tmrClr">"Таймер очищен"</string>
<string name="seconds">"секунды"</string>
<string name="hours">"часы"</string>
<string name="hour">"час"</string>
<string name="minutes">"минут"</string>
<string name="minute">"минута"</string>
<string name="dlyDur">"Длительность задержки"</string>
<string name="tmrvbrt">"Таймер вибрации"</string>
<string name="tmrSnd">"Звук таймера"</string>
<string name="aTPrst">"Добавлено в предустановки"</string>
<string name="fwr">"для какого рецепта?"</string>
<string name="tmrPrsts">"Предустановки таймера"</string>
<string name="prstBtn">"ПРЕЗЕТЫ"</string>
<string name="delay">"Задержка"</string>
<string name="stop">"Стоп"</string>
<string name="sec">"вто"</string>
<string name="timer">"Таймер готовки"</string>
<string name="ntmr">"Новый таймер"</string>
<string name="tmr">"Таймер %1$s"</string>
<string name="strtBtn">"СТАРТ"</string>
<string name="sysDefB">"По умолчанию + Чернить"</string>
<string name="buto">"Резервировано до %1$s"</string>
<string name="yld">"Урожай"</string>
<string name="yieldU">"Подавать в"</string>
@ -292,4 +313,6 @@
<string name="aBtn">"ДОБАВИТЬ"</string>
<string name="About">"О приложении"</string>
<string name="aap">"Прикрепить фото"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
</resources>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="sysDefB">"அமைப்பு இயல்புநிலை + கருப்பு"</string>
<string name="buto">"%1$s இல் காப்புப் பிரதி எடுக்கப்பட்டது"</string>
<string name="yld">"மகசூல்"</string>
<string name="yieldU">"மகசூல் அலகு"</string>
@ -292,4 +293,26 @@
<string name="aBtn">"சேர்"</string>
<string name="About">"பற்றி"</string>
<string name="aap">"புகைப்படத்தை இணைக்கவும்"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
<string name="seconds">"seconds"</string>
<string name="hours">"hours"</string>
<string name="hour">"hour"</string>
<string name="minutes">"minutes"</string>
<string name="minute">"minute"</string>
<string name="dlyDur">"Delay duration"</string>
<string name="tmrvbrt">"Timer vibrate"</string>
<string name="tmrSnd">"Timer sound"</string>
<string name="aTPrst">"Added to presets"</string>
<string name="fwr">"for which recipe?"</string>
<string name="tmrPrsts">"Timer presets"</string>
<string name="prstBtn">"PRESETS"</string>
<string name="tmr">"Timer %1$s"</string>
<string name="delay">"Delay"</string>
<string name="stop">"Stop"</string>
<string name="strtBtn">"START"</string>
<string name="ntmr">"New timer"</string>
<string name="timer">"Cooking Timer"</string>
<string name="sec">"sec"</string>
<string name="tmrClr">"tmrClr"</string>
</resources>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="sysDefB">"సిస్టమ్ డిఫాల్ట్ + నలుపు"</string>
<string name="buto">"%1$s కు బ్యాకప్ చేయబడింది"</string>
<string name="yld">"దిగుబడి"</string>
<string name="yieldU">"దిగుబడి యూనిట్"</string>
@ -292,4 +293,26 @@
<string name="aBtn">"చేర్చు"</string>
<string name="About">"గురించి"</string>
<string name="aap">"ఫోటోను అటాచ్ చేయండి"</string>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
<string name="seconds">"seconds"</string>
<string name="hours">"hours"</string>
<string name="hour">"hour"</string>
<string name="minutes">"minutes"</string>
<string name="minute">"minute"</string>
<string name="dlyDur">"Delay duration"</string>
<string name="tmrvbrt">"Timer vibrate"</string>
<string name="tmrSnd">"Timer sound"</string>
<string name="aTPrst">"Added to presets"</string>
<string name="fwr">"for which recipe?"</string>
<string name="tmrPrsts">"Timer presets"</string>
<string name="prstBtn">"PRESETS"</string>
<string name="tmr">"Timer %1$s"</string>
<string name="delay">"Delay"</string>
<string name="stop">"Stop"</string>
<string name="strtBtn">"START"</string>
<string name="ntmr">"New timer"</string>
<string name="timer">"Cooking Timer"</string>
<string name="sec">"sec"</string>
<string name="tmrClr">"tmrClr"</string>
</resources>

View file

@ -9,6 +9,9 @@
<color name="ns_accent">
#ffffff
</color>
<color name="orange">
#ff5200
</color>
<color name="white">
#ffffff
</color>

View file

@ -1,5 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="notifSetg">"Notification settings"</string>
<string name="tmrRm">"Timer removed"</string>
<string name="seconds">"seconds"</string>
<string name="hours">"hours"</string>
<string name="hour">"hour"</string>
<string name="minutes">"minutes"</string>
<string name="minute">"minute"</string>
<string name="dlyDur">"Delay duration"</string>
<string name="tmrvbrt">"Timer vibrate"</string>
<string name="tmrSnd">"Timer sound"</string>
<string name="aTPrst">"Added to presets"</string>
<string name="fwr">"for which recipe?"</string>
<string name="tmrPrsts">"Timer presets"</string>
<string name="prstBtn">"PRESETS"</string>
<string name="tmr">"Timer %1$s"</string>
<string name="delay">"Delay"</string>
<string name="stop">"Stop"</string>
<string name="strtBtn">"START"</string>
<string name="ntmr">"New timer"</string>
<string name="timer">"Cooking Timer"</string>
<string name="sysDefB">"System default + Black"</string>
<string name="buto">"Backed up to %1$s"</string>
<string name="yld">"Yield"</string>
<string name="yieldU">"Yield unit"</string>
@ -145,6 +166,7 @@
<string name="Moderate">"Moderate"</string>
<string name="ml">"ml"</string>
<string name="minimal">"Minimal"</string>
<string name="sec">"sec"</string>
<string name="min">"min"</string>
<string name="Millilitre">"Millilitre"</string>
<string name="mg">"mg"</string>
@ -292,4 +314,5 @@
<string name="aBtn">"ADD"</string>
<string name="About">"About"</string>
<string name="aap">"Attach a photo"</string>
<string name="tmrClr">"tmrClr"</string>
</resources>

View file

@ -2,13 +2,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">
<style name="LaunchScreenThemeBase" parent="Theme.AppCompat.NoActionBar">
<item name="colorPrimary">
@color/light
</item>
<item name="colorPrimaryDark">
@color/light
</item>
<item name="colorAccent">
@color/light
@color/orange
</item>
<item name="android:windowBackground">
@drawable/splash_screen
@ -16,6 +10,9 @@
<item name="android:windowLightStatusBar">
true
</item>
<item name="android:statusBarColor">
@color/light
</item>
<item name="android:windowLightNavigationBar" tools:targetApi="27">
true
</item>
@ -26,30 +23,38 @@
<style name="LaunchScreenTheme" parent="LaunchScreenThemeBase">
</style>
<style name="AppThemeBase" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimary">
@color/light
</item>
<item name="colorPrimaryDark">
@color/light
</item>
<item name="colorAccent">
@color/light
@color/orange
</item>
<item name="colorControlNormal">
#00000000
</item>
</style>
<style name="AppTheme" parent="AppThemeBase">
<item name="android:listViewStyle">@style/ListViewTheme</item>
<item name="android:scrollViewStyle">@style/ScrollViewTheme</item>
<item name="android:listViewStyle">
@style/ListViewTheme
</item>
<item name="android:scrollViewStyle">
@style/ScrollViewTheme
</item>
</style>
<style name="ListViewTheme" parent="android:Widget.ListView">
<item name="android:overScrollMode">never</item>
<item name="android:divider">#00000000</item>
<item name="android:dividerHeight">0dp</item>
<item name="android:listSelector">#00000000</item>
<item name="android:overScrollMode">
never
</item>
<item name="android:divider">
#00000000
</item>
<item name="android:dividerHeight">
0dp
</item>
<item name="android:listSelector">
#00000000
</item>
</style>
<style name="ScrollViewTheme" parent="android:Widget.ScrollView">
<item name="android:overScrollMode">never</item>
<item name="android:overScrollMode">
never
</item>
</style>
</resources>

View file

@ -1,3 +1,5 @@
declare const android: any
export const lvMixin = {
methods: {
transparentPage({ object }) {

View file

@ -1,20 +1,30 @@
import { Application, AndroidApplication, Utils } from '@nativescript/core'
import {
Application,
AndroidApplication,
Utils,
Device,
Color,
path,
knownFolders,
TimerInfo,
} from '@nativescript/core'
let timerOne
declare const global, android, androidx, com, java, Array: any
export const restartApp = () => {
const ctx = Utils.ad.getApplicationContext()
let mStartActivity = new android.content.Intent(
Application.android.context,
ctx,
Application.android.startActivity.getClass()
)
let mPendingIntentId = Math.random() * 100000
let mPendingIntent = android.app.PendingIntent.getActivity(
Application.android.context,
ctx,
mPendingIntentId,
mStartActivity,
android.app.PendingIntent.FLAG_CANCEL_CURRENT
)
let mgr = Application.android.context.getSystemService(
android.content.Context.ALARM_SERVICE
)
let mgr = ctx.getSystemService(android.content.Context.ALARM_SERVICE)
mgr.set(
android.app.AlarmManager.RTC,
java.lang.System.currentTimeMillis() + 100,
@ -86,11 +96,12 @@ export const getRecipePhoto = () => {
android.content.Intent.ACTION_GET_CONTENT
)
intent.setType('image/*')
return callIntent(ctx, intent, 'Select photo', DIR_CODE).then((res) => {
if (res.resultCode === android.app.Activity.RESULT_OK)
if (res.intent != null && res.intent.getData())
return res.intent.getData()
})
return callIntent(ctx, intent, 'Select photo', DIR_CODE).then(
({ resultCode, intent }: any) => {
if (resultCode === android.app.Activity.RESULT_OK)
if (intent != null && intent.getData()) return intent.getData()
}
)
}
export const copyPhotoToCache = (uri, filepath) => {
const ContentResolver = Application.android.nativeApp.getContentResolver()
@ -112,6 +123,26 @@ export const copyPhotoToCache = (uri, filepath) => {
})
}
// COPY DB FILE
export const copyDBToExport = () => {
const src = path.join(knownFolders.documents().path, 'EnRecipes.db')
const dst = path.join(
knownFolders.documents().getFolder('EnRecipes').path,
'EnRecipes.db'
)
const input = new java.io.FileInputStream(src)
try {
const output = new java.io.FileOutputStream(dst)
let len: number
let buffer = Array.create('byte', 1024)
while ((len = input.read(buffer)) > 0) output.write(buffer, 0, len)
} catch (error) {
console.log(error)
} finally {
input.close()
}
}
// BACKUP FOLDER PICKER
export const getBackupFolder = () => {
const ctx =
@ -120,11 +151,12 @@ export const getBackupFolder = () => {
const intent = new android.content.Intent(
android.content.Intent.ACTION_OPEN_DOCUMENT_TREE
)
return callIntent(ctx, intent, 'Select folder', DIR_CODE).then((res) => {
if (res.resultCode === android.app.Activity.RESULT_OK)
if (res.intent != null && res.intent.getData())
return res.intent.getData()
})
return callIntent(ctx, intent, 'Select folder', DIR_CODE).then(
({ resultCode, intent }: any) => {
if (resultCode === android.app.Activity.RESULT_OK)
if (intent != null && intent.getData()) return intent.getData()
}
)
}
// BACKUP FILE PICKER
@ -138,10 +170,9 @@ export const getBackupFile = () => {
intent.addCategory(android.content.Intent.CATEGORY_OPENABLE)
intent.setType('application/zip')
return callIntent(ctx, intent, 'Select file to import', DIR_CODE).then(
(res) => {
if (res.resultCode === android.app.Activity.RESULT_OK) {
if (res.intent != null && res.intent.getData())
return res.intent.getData()
({ resultCode, intent }: any) => {
if (resultCode === android.app.Activity.RESULT_OK) {
if (intent != null && intent.getData()) return intent.getData()
}
}
)
@ -149,7 +180,7 @@ export const getBackupFile = () => {
// ZIP OPERATIONS
export class Zip {
static getSubFiles(src, isRootFolder) {
static getSubFiles(src: string, isRootFolder?: boolean) {
const fileList = new java.util.ArrayList()
const sourceFile = new java.io.File(src)
let tempList = sourceFile.listFiles()
@ -272,3 +303,189 @@ export const shareImage = (image, subject) => {
intent.putExtra(android.content.Intent.EXTRA_STREAM, shareUri)
share(intent, subject)
}
// TIMER NOTIFICATION
export class TimerNotif {
static getIcon(ctx, icon) {
const packageName = ctx.getApplicationInfo().packageName
let resources = ctx.getResources()
return (
resources.getIdentifier(icon, 'drawable', packageName) ||
ctx.getApplicationInfo().icon
)
}
static clear(nID) {
let ctx = Utils.ad.getApplicationContext()
const NotifySrv = ctx.getSystemService(
android.content.Context.NOTIFICATION_SERVICE
)
// nID ? NotifySrv.cancel(nID) : NotifySrv.cancelAll()
NotifySrv.cancel(nID)
}
static getNotification(
{
actions,
bID,
cID,
cName,
description,
nID,
priority,
sound,
title,
vibrate,
}: {
actions?: boolean
bID: string
cID: string
cName: string
description: string
nID: number
priority: number
sound: string
title: string
vibrate?: number
},
ctx
) {
let sdkv: number = parseInt(Device.sdkVersion)
let soundUri: any
if (sound) soundUri = new android.net.Uri.parse(sound)
const NotifyMgr = android.app.NotificationManager
const NotifySrv = ctx.getSystemService(
android.content.Context.NOTIFICATION_SERVICE
)
const NotificationCompat = androidx.core.app.NotificationCompat
const AudioManager = android.media.AudioManager
if (sdkv >= 26) {
const importance =
priority > 0 ? NotifyMgr.IMPORTANCE_HIGH : NotifyMgr.IMPORTANCE_MIN
console.log(priority, importance)
const AudioAttributes = android.media.AudioAttributes
const audioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ALARM)
.build()
const Channel = new android.app.NotificationChannel(
cID,
cName,
importance
)
if (description) Channel.setDescription(description)
Channel.enableVibration(vibrate)
Channel.enableLights(false)
if (sound) Channel.setSound(soundUri, audioAttributes)
else Channel.setSound(null, null)
Channel.setShowBadge(true)
Channel.setLockscreenVisibility(NotificationCompat.VISIBILITY_PUBLIC)
NotifySrv.createNotificationChannel(Channel)
}
const Intent = android.content.Intent
const PendingIntent = android.app.PendingIntent
const mainInt = new Intent(ctx, com.tns.NativeScriptActivity.class)
mainInt.putExtra('action', 'open_timer')
const mainPInt = PendingIntent.getActivity(
ctx,
1,
mainInt,
PendingIntent.FLAG_UPDATE_CURRENT
)
// Action intent
let actionInt1, actionInt2, actionPInt1, actionPInt2
if (actions) {
actionInt1 = new Intent(bID)
actionInt1.putExtra('action', 'stop')
actionPInt1 = PendingIntent.getBroadcast(
ctx,
2,
actionInt1,
PendingIntent.FLAG_UPDATE_CURRENT
)
actionInt2 = new Intent(bID)
actionInt2.putExtra('action', 'delay')
actionPInt2 = PendingIntent.getBroadcast(
ctx,
3,
actionInt2,
PendingIntent.FLAG_UPDATE_CURRENT
)
}
// CREATE NOTIFICATION
let icon = TimerNotif.getIcon(ctx, 'ic_stat_notify_silhouette')
let builder = new NotificationCompat.Builder(ctx, cID)
.setColor(new Color('#ff5200').android)
.setContentIntent(mainPInt)
.setContentTitle(title)
.setOngoing(true)
.setPriority(priority)
.setShowWhen(actions)
.setSmallIcon(icon)
.setTicker(title)
.setAutoCancel(false)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
if (sound) builder.setSound(soundUri, AudioManager.STREAM_ALARM)
else builder.setSound(null)
if (description) builder.setContentText(description)
if (vibrate) builder.setVibrate([500, 1000])
if (actions) {
builder.setDeleteIntent(actionPInt2)
builder.setFullScreenIntent(mainPInt, true)
builder.addAction(null, 'Stop', actionPInt1)
builder.addAction(null, 'Delay', actionPInt2)
}
let notification = builder.build()
notification.flags =
NotificationCompat.FLAG_INSISTENT | NotificationCompat.FLAG_ONGOING_EVENT
return notification
}
static show(data) {
const ctx = Utils.ad.getApplicationContext()
const NotifySrv = ctx.getSystemService(
android.content.Context.NOTIFICATION_SERVICE
)
NotifySrv.notify(data.nID, TimerNotif.getNotification(data, ctx))
}
}
// GET RINGTONES LIST
export const getTones = () => {
const RingtoneManager = android.media.RingtoneManager
let ctx = Utils.ad.getApplicationContext()
const ringtonesMgr = new RingtoneManager(ctx)
ringtonesMgr.setType(RingtoneManager.TYPE_ALARM)
const cursor = ringtonesMgr.getCursor()
let tones = []
while (cursor.moveToNext()) {
tones.push({
title: cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX),
uri:
cursor.getString(RingtoneManager.URI_COLUMN_INDEX) +
'/' +
cursor.getString(RingtoneManager.ID_COLUMN_INDEX),
})
}
let defaultToneUri = RingtoneManager.getActualDefaultRingtoneUri(
ctx,
RingtoneManager.TYPE_ALARM
)
let defaultTone
if (defaultToneUri) {
let uriString = defaultToneUri.toString()
let tonesAvailable = tones.filter((e) => e.uri == uriString)
let toneExist = tonesAvailable.length
defaultTone = {
title: toneExist ? tonesAvailable[0].title : tones[0].title,
uri: toneExist ? uriString : tones[0].uri,
}
}
return { tones, defaultTone: defaultToneUri ? defaultTone : tones[0] }
}

View file

@ -1,14 +1,36 @@
import Vue from 'nativescript-vue'
import Vuex from 'vuex'
Vue.use(Vuex)
import { CouchBase } from '@triniwiz/nativescript-couchbase'
import { getFileAccess, File, ApplicationSettings, Application } from '@nativescript/core'
const EnRecipesDB = new CouchBase('EnRecipes')
const userCuisinesDB = new CouchBase('userCuisines')
const userCategoriesDB = new CouchBase('userCategories')
const userYieldUnitsDB = new CouchBase('userYieldUnits')
const userUnitsDB = new CouchBase('userUnits')
const mealPlansDB = new CouchBase('mealPlans')
import { openOrCreate } from '@akylas/nativescript-sqlite'
import {
getFileAccess,
File,
ApplicationSettings,
Application,
knownFolders,
path,
} from '@nativescript/core'
// OPEN DATABASE FILE
const db = openOrCreate(
path.join(knownFolders.documents().path, 'EnRecipes.db')
)
// 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
db.execute(
'CREATE TABLE IF NOT EXISTS lists (cuisines TEXT, categories TEXT, yieldUnits TEXT, units TEXT)'
)
// CREATE mealPlans TABLE
db.execute(
'CREATE TABLE IF NOT EXISTS mealPlans (date INT, type TEXT, title TEXT)'
)
const defaultCuisines = [
'American',
'Brazilian',
@ -116,30 +138,18 @@ const defaultUnits = [
]
const listItems = {
cuisines: {
db: userCuisinesDB,
key: 'userCuisines',
stateName: 'cuisines',
sort: true,
defaultItems: defaultCuisines,
},
categories: {
db: userCategoriesDB,
key: 'userCategories',
stateName: 'categories',
sort: true,
defaultItems: defaultCategories,
},
yieldUnits: {
db: userYieldUnitsDB,
key: 'userYieldUnits',
stateName: 'yieldUnits',
sort: false,
defaultItems: defaultYieldUnits,
},
units: {
db: userUnitsDB,
key: 'userUnits',
stateName: 'units',
sort: false,
defaultItems: defaultUnits,
},
@ -154,61 +164,69 @@ export default new Vuex.Store({
units: [],
mealPlans: [],
icon: {
back: '\ue900',
bag: '\ue901',
bagged: '\ue902',
cal: '\ue903',
category: '\ue904',
check: '\ue905',
cog: '\ue906',
cog: '\ue900',
home: '\ue901',
try: '\ue902',
tried: '\ue903',
fav: '\ue904',
faved: '\ue905',
menu: '\ue906',
cuisine: '\ue907',
db: '\ue908',
del: '\ue909',
diff: '\ue90a',
don: '\ue90b',
done: '\ue90c',
edit: '\ue90d',
exp: '\ue90e',
fav: '\ue90f',
faved: '\ue910',
filter: '\ue911',
folder: '\ue912',
gh: '\ue913',
help: '\ue914',
home: '\ue915',
img: '\ue916',
imp: '\ue917',
info: '\ue918',
interface: '\ue919',
lang: '\ue91a',
layout: '\ue91b',
left: '\ue91c',
menu: '\ue91d',
opts: '\ue91e',
plus: '\ue91f',
price: '\ue920',
priv: '\ue921',
reset: '\ue922',
right: '\ue923',
save: '\ue924',
sear: '\ue925',
share: '\ue926',
shuf: '\ue927',
sort: '\ue928',
star: '\ue929',
starred: '\ue92a',
tag: '\ue92b',
tg: '\ue92c',
theme: '\ue92d',
time: '\ue92e',
tod: '\ue92f',
trans: '\ue930',
tried: '\ue931',
try: '\ue932',
uncheck: '\ue933',
undo: '\ue934',
week: '\ue935',
x: '\ue936',
category: '\ue908',
tag: '\ue909',
star: '\ue90a',
starred: '\ue90b',
time: '\ue90c',
diff: '\ue90d',
bag: '\ue90e',
bagged: '\ue90f',
price: '\ue910',
sear: '\ue911',
sort: '\ue912',
filter: '\ue913',
plus: '\ue914',
done: '\ue915',
back: '\ue916',
x: '\ue917',
del: '\ue918',
save: '\ue919',
undo: '\ue91a',
edit: '\ue91b',
cal: '\ue91c',
tod: '\ue91d',
left: '\ue91e',
right: '\ue91f',
img: '\ue920',
uncheck: '\ue921',
check: '\ue922',
share: '\ue923',
timer: '\ue924',
start: '\ue925',
pause: '\ue926',
addTo: '\ue927',
sound: '\ue928',
vibrate: '\ue929',
interface: '\ue92a',
opts: '\ue92b',
db: '\ue92c',
reset: '\ue92d',
info: '\ue92e',
lang: '\ue92f',
theme: '\ue930',
layout: '\ue931',
shuf: '\ue932',
week: '\ue933',
folder: '\ue934',
exp: '\ue935',
imp: '\ue936',
gh: '\ue937',
tg: '\ue938',
help: '\ue939',
priv: '\ue93a',
don: '\ue93b',
trans: '\ue93c',
delay: '\ue93d',
ring: '\ue93e',
},
currentComponent: 'EnRecipes',
sortType: 'Oldest first',
@ -290,20 +308,91 @@ export default new Vuex.Store({
title: 'తెలుగు',
},
],
shakeEnabled: true,
shakeEnabled: ApplicationSettings.getBoolean('shakeEnabled', true),
importSummary: {
found: 0,
imported: 0,
updated: 0,
},
layout: 'detailed',
layout: ApplicationSettings.getString('layout', 'detailed'),
selectedCuisine: null,
selectedCategory: null,
selectedTag: null,
appTheme: 'sysDef',
mondayFirst: false,
mondayFirst: ApplicationSettings.getBoolean('mondayFirst', false),
timerDelay: ApplicationSettings.getString('timerDelay', '1 minute'),
timerSound: {},
timerVibrate: ApplicationSettings.getBoolean('timerVibrate', false),
timerPresets: [
{
id: 534534563,
label: 'Soft Eggs',
recipeID: null,
time: '00:06:00',
timerInterval: null,
isPaused: false,
preset: 1,
},
{
id: 564646,
label: 'Medium Eggs',
recipeID: null,
time: '00:08:00',
timerInterval: null,
isPaused: false,
preset: 1,
},
{
id: 43276767,
label: 'Hard Eggs',
recipeID: null,
time: '00:10:00',
timerInterval: null,
isPaused: false,
preset: 1,
},
],
activeTimers: [],
timerIntervals: [],
},
mutations: {
addTimerPreset(state, timer) {
state.timerPresets.push(timer)
},
removeTimerPreset(state, index) {
state.timerPresets.splice(index, 1)
},
clearTimerInterval(state) {
state.activeTimers.forEach((e) => {
clearInterval(e.timerInterval)
e.timerInterval = null
})
},
addActiveTimer(state, { timer, index }) {
state.activeTimers.splice(index, 0, timer)
},
updateActiveTimer(state, timer) {
let index = state.activeTimers.findIndex((e) => e.id == timer.id)
state.activeTimers.splice(index, 1, timer)
},
removeActiveTimer(state, index) {
state.activeTimers.splice(index, 1)
},
setTimerDelay(state, delay) {
state.timerDelay = delay
ApplicationSettings.setString('timerDelay', delay)
},
setTimerSound(state, sound) {
state.timerSound = {
title: sound.title,
uri: sound.uri,
}
ApplicationSettings.setString('timerSound', JSON.stringify(sound))
},
setTimerVibrate(state, bool) {
state.timerVibrate = bool
ApplicationSettings.setBoolean('timerVibrate', bool)
},
clearImportSummary(state) {
for (const key in state.importSummary) state.importSummary[key] = 0
},
@ -314,14 +403,16 @@ export default new Vuex.Store({
setTheme(state, theme) {
switch (theme) {
case 'sysDef':
state.appTheme = Application.systemAppearance() == 'dark' ? "Dark" : "Light"
break;
state.appTheme =
Application.systemAppearance() == 'dark' ? 'Dark' : 'Light'
break
case 'sysDefB':
state.appTheme = Application.systemAppearance() == 'dark' ? "Black" : "Light"
break;
state.appTheme =
Application.systemAppearance() == 'dark' ? 'Black' : 'Light'
break
default:
state.appTheme = theme
break;
break
}
ApplicationSettings.setString('appTheme', theme)
},
@ -335,25 +426,20 @@ export default new Vuex.Store({
state.sortType = sortType
},
initRecipes(state) {
EnRecipesDB.query({ select: [] }).forEach((r) => {
if (r.timeRequired) {
r.prepTime = '00:00'
r.cookTime = r.timeRequired
delete r.timeRequired
}
if (!r.hasOwnProperty('cuisine')) r.cuisine = 'Undefined'
if (!r.hasOwnProperty('tags')) r.tags = []
if (!r.hasOwnProperty('difficulty')) r.difficulty = 'Easy'
if (!r.hasOwnProperty('rating')) r.rating = 0
if (!r.hasOwnProperty('created')) r.created = r.lastModified
// if (!r.hasOwnProperty("inBag"))
// r.inBag = false
state.recipes.push(r)
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 = ApplicationSettings.getBoolean('shakeEnabled', true)
state.sortType = ApplicationSettings.getString('sortType', 'Oldest first')
},
importRecipes(state, recipes) {
importRecipesFromJSON(state, recipes) {
let localRecipesIDs, partition
let imported = 0
let updated = 0
@ -365,45 +451,100 @@ export default new Vuex.Store({
r.cookTime = r.timeRequired
delete r.timeRequired
}
if (r.imageSrc) {
r.image = r.imageSrc.replace('enrecipes', 'EnRecipes')
delete r.imageSrc
}
if (!r.hasOwnProperty('cuisine')) r.cuisine = 'Undefined'
if (!r.hasOwnProperty('tags')) r.tags = []
if (!r.hasOwnProperty('difficulty')) r.difficulty = 'Easy'
if (!r.hasOwnProperty('rating')) r.rating = 0
if (!r.hasOwnProperty('created')) r.created = r.lastModified
// if (!r.hasOwnProperty("inBag"))
// r.inBag = false
r.yieldQuantity = r.yield.quantity
r.yieldUnit = r.yield.unit
delete r.yield
return r
})
}
function createDocuments(data) {
data = getUpdatedData(data)
state.recipes = [...state.recipes, ...data]
data.forEach((recipe) => {
data.forEach((r) => {
imported++
EnRecipesDB.createDocument(recipe, recipe.id)
db.execute(
`INSERT INTO recipes (id, image, title, cuisine, category, tags, prepTime, cookTime, yieldQuantity, yieldUnit, difficulty, rating, ingredients, instructions, combinations, notes, favorite, tried, lastTried, lastModified, created) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
[
r.id,
r.image,
r.title,
r.cuisine,
r.category,
JSON.stringify(r.tags),
r.prepTime,
r.cookTime,
r.yieldQuantity,
r.yieldUnit,
r.difficulty,
r.rating,
JSON.stringify(r.ingredients),
JSON.stringify(r.instructions),
JSON.stringify(r.combinations),
JSON.stringify(r.notes),
r.favorite ? 1 : 0,
r.tried ? 1 : 0,
r.lastTried ? new Date(r.lastTried).getTime() : null,
r.lastModified ? new Date(r.lastModified).getTime() : null,
r.created ? new Date(r.created).getTime() : null,
]
)
})
}
function updateDocuments(data) {
data = getUpdatedData(data)
data.forEach((recipe) => {
data.forEach((r) => {
let recipeIndex = state.recipes
.map((e, i) => {
let d1 = new Date(e.lastModified).getTime()
let d2 = new Date(recipe.lastModified).getTime()
return e.id === recipe.id && d1 < d2 ? i : -1
let d2 = new Date(r.lastModified).getTime()
return e.id === r.id && d1 < d2 ? i : -1
})
.filter((e) => e >= 0)[0]
if (recipeIndex >= 0) {
updated++
Object.assign(state.recipes[recipeIndex], recipe)
EnRecipesDB.updateDocument(recipe.id, recipe)
Object.assign(state.recipes[recipeIndex], r)
db.execute(
`REPLACE INTO recipes (id, image, title, cuisine, category, tags, prepTime, cookTime, yieldQuantity, yieldUnit, difficulty, rating, ingredients, instructions, combinations, notes, favorite, tried, lastTried, lastModified, created) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
[
r.id,
r.image,
r.title,
r.cuisine,
r.category,
JSON.stringify(r.tags),
r.prepTime,
r.cookTime,
r.yieldQuantity,
r.yieldUnit,
r.difficulty,
r.rating,
JSON.stringify(r.ingredients),
JSON.stringify(r.instructions),
JSON.stringify(r.combinations),
JSON.stringify(r.notes),
r.favorite ? 1 : 0,
r.tried ? 1 : 0,
r.lastTried ? new Date(r.lastTried).getTime() : null,
r.lastModified ? new Date(r.lastModified).getTime() : null,
r.created ? new Date(r.created).getTime() : null,
]
)
}
})
}
if (state.recipes.length) {
localRecipesIDs = state.recipes.map((e) => e.id)
partition = recipes.reduce(
(result, recipe, i) => {
(result, recipe) => {
localRecipesIDs.indexOf(recipe.id) < 0
? result[0].push(recipe) // create candidates
: result[1].push(recipe) // update candidates
@ -420,160 +561,194 @@ export default new Vuex.Store({
state.importSummary.imported = imported
state.importSummary.updated = updated
},
addRecipe(state, { id, recipe }) {
state.recipes.push(recipe)
EnRecipesDB.createDocument(recipe, id)
},
overwriteRecipe(state, { id, recipe }) {
let index = state.recipes.indexOf(
state.recipes.filter((e) => e.id === id)[0]
importRecipesFromDB(state, recipes) {
let localRecipesIDs: string[], partition: any[]
let imported = 0
let updated = 0
function createDocuments(data: any[]) {
data.forEach((r) => {
const cols = Object.keys(r).join(', ')
const placeholder = Object.keys(r)
.fill('?')
.join(', ')
imported++
db.execute(
`REPLACE INTO recipes (${cols}) VALUES (${placeholder})`,
Object.values(r)
)
Object.assign(state.recipes[index], recipe)
EnRecipesDB.updateDocument(id, recipe)
},
deleteRecipe(state, { index, id }) {
getFileAccess().deleteFile(state.recipes[index].imageSrc)
state.recipes.splice(index, 1)
EnRecipesDB.deleteDocument(id)
state.recipes.forEach((e, i) => {
if (e.combinations.includes(id)) {
state.recipes[i].combinations.splice(e.combinations.indexOf(id), 1)
EnRecipesDB.updateDocument(state.recipes[i].id, state.recipes[i])
Object.keys(r).forEach(
(f) =>
f.match(/tags|ingredients|instructions|combinations|notes/) &&
(r[f] = JSON.parse(r[f]))
)
state.recipes.push(r)
})
}
function updateDocuments(data: any[]) {
data.forEach((r) => {
let recipeIndex = state.recipes
.map((e, i) => {
let d1 = new Date(e.lastModified).getTime()
let d2 = new Date(r.lastModified).getTime()
return e.id === r.id && d1 < d2 ? i : -1
})
.filter((e) => e >= 0)[0]
if (recipeIndex >= 0) {
updated++
const cols = Object.keys(r).join(', ')
const placeholder = Object.keys(r)
.fill('?')
.join(', ')
db.execute(
`REPLACE INTO recipes (${cols}) VALUES (${placeholder})`,
Object.values(r)
)
Object.keys(r).forEach(
(f) =>
f.match(/tags|ingredients|instructions|combinations|notes/) &&
(r[f] = JSON.parse(r[f]))
)
Object.assign(state.recipes[recipeIndex], r)
}
})
}
if (state.recipes.length) {
localRecipesIDs = state.recipes.map((e) => e.id)
partition = recipes.reduce(
(result, recipe) => {
localRecipesIDs.indexOf(recipe.id) < 0
? result[0].push(recipe) // create candidates
: result[1].push(recipe) // update candidates
return result
},
[[], []]
)
if (partition[0].length) createDocuments(partition[0])
if (partition[1].length) updateDocuments(partition[1])
} else createDocuments(recipes)
state.importSummary.found = recipes.length
state.importSummary.imported = imported
state.importSummary.updated = updated
},
addRecipe(state, recipe) {
let r = JSON.parse(JSON.stringify(recipe))
Object.keys(recipe).forEach((e) => {
if (e.match(/tags|ingredients|instructions|combinations|notes/))
r[e] = JSON.stringify(r[e])
if (e.match(/favorite|tried/)) r[e] = r[e] ? 1 : 0
})
const cols = Object.keys(recipe).join(', ')
const placeholder = Object.keys(recipe)
.fill('?')
.join(', ')
db.execute(
`REPLACE INTO recipes (${cols}) VALUES (${placeholder})`,
Object.values(r)
)
let i: number
function exist({ id }, index: number) {
if (id === recipe.id) {
i = index
return true
}
return false
}
state.recipes.some(exist)
? Object.assign(state.recipes[i], recipe)
: state.recipes.push(recipe)
},
deleteRecipes(state, ids) {
ids.forEach((id) => {
ids.forEach((id: string) => {
let index = state.recipes.findIndex((e) => e.id === id)
getFileAccess().deleteFile(state.recipes[index].imageSrc)
getFileAccess().deleteFile(state.recipes[index].image)
state.recipes.splice(index, 1)
EnRecipesDB.deleteDocument(id)
db.execute(`DELETE FROM recipes WHERE id = '${id}'`)
state.recipes.forEach((e, i) => {
if (e.combinations.includes(id)) {
state.recipes[i].combinations.splice(e.combinations.indexOf(id), 1)
EnRecipesDB.updateDocument(state.recipes[i].id, state.recipes[i])
db.execute(
`UPDATE recipes SET combinations = '${JSON.stringify(
state.recipes[i].combinations
)}' WHERE id = '${id}'`
)
}
})
})
},
initListItems(state) {
function initialize(listName) {
let userItems
let db = listItems[listName].db
let key = listItems[listName].key
let stateName = listItems[listName].stateName
let defaultItems = listItems[listName].defaultItems
if (!state[stateName].length) {
let isStored = db.query({ select: [] }).length
if (isStored) {
userItems = db.getDocument(key)[key]
if (userItems.some((e) => defaultItems.includes(e)))
state[stateName] = userItems
else state[stateName] = [...defaultItems, ...userItems]
} else {
if (listItems[listName].sort) {
state[stateName].sort()
}
state[stateName] = defaultItems
db.createDocument(
{
[key]: [],
},
key
if (!state.cuisines.length) {
db.select(`SELECT * FROM lists`).then((res) => {
if (!res.length) {
db.execute(
`INSERT INTO lists (cuisines, categories, yieldUnits, units) VALUES (?, ?, ?, ?)`,
[null, null, null, null]
)
}
db.select(`SELECT * FROM lists`).then((res) => {
Object.keys(res[0]).forEach((list) => {
let userItems: string[]
let defaultItems = listItems[list].defaultItems
if (res[0][list]) {
userItems = JSON.parse(res[0][list])
state[list] = userItems.some((e: string) =>
defaultItems.includes(e)
)
? userItems
: [...defaultItems, ...userItems]
} else {
state[list] = defaultItems
listItems[list].sort && state[list].sort()
}
}
;['cuisines', 'categories', 'yieldUnits', 'units'].forEach((item) => {
initialize(item)
})
})
})
}
},
importListItems(state, { data, listName }) {
let db = listItems[listName].db
let key = listItems[listName].key
let stateName = listItems[listName].stateName
let items = new Set([...state[stateName], ...data])
state[stateName] = [...items]
if (listItems[listName].sort) state[stateName].sort()
db.updateDocument(key, { [key]: state[stateName] })
state[listName] = [...new Set([...state[listName], ...data])]
if (listItems[listName].sort) state[listName].sort()
db.execute(
`UPDATE lists SET ${listName} = '${JSON.stringify(state[listName])}'`
)
},
addListItem(state, { item, listName }) {
let db = listItems[listName].db
let key = listItems[listName].key
let stateName = listItems[listName].stateName
let lowercase = state[stateName].map((e) => e.toLowerCase())
let lowercase = state[listName].map((e: string) => e.toLowerCase())
if (lowercase.indexOf(item.toLowerCase()) == -1) {
state[stateName].push(item)
db.updateDocument(key, { [key]: state[stateName] })
state[listName].push(item)
if (listItems[listName].sort)
state[stateName].sort((a, b) =>
state[listName].sort((a: string, b: string) =>
a.toLowerCase().localeCompare(b.toLowerCase())
)
db.execute(
`UPDATE lists SET ${listName} = '${JSON.stringify(state[listName])}'`
)
}
},
removeListItem(state, { item, listName }) {
let db = listItems[listName].db
let key = listItems[listName].key
let stateName = listItems[listName].stateName
let index = state[stateName].indexOf(item)
state[stateName].splice(index, 1)
db.updateDocument(key, { [key]: state[stateName] })
if (listItems[listName].sort) state[stateName].sort()
state[listName].splice(state[listName].indexOf(item), 1)
db.execute(
`UPDATE lists SET ${listName} = '${JSON.stringify(state[listName])}'`
)
},
resetListItems(state, listName) {
let stateName = listItems[listName].stateName
let defaultItems = listItems[listName].defaultItems
state[listName] = [...defaultItems]
if (listItems[listName].sort) {
state[stateName].sort()
}
if (listItems[listName].sort)
state[listName].sort((a: string, b: string) =>
a.toLowerCase().localeCompare(b.toLowerCase())
)
db.execute(
`UPDATE lists SET ${listName} = '${JSON.stringify(state[listName])}'`
)
},
initMealPlans(state) {
let isMealPlansDBStored = mealPlansDB.query({ select: [] }).length
if (isMealPlansDBStored) {
let plans = mealPlansDB.getDocument('mealPlans').mealPlans
if (plans.length && plans[0].hasOwnProperty('eventColor')) {
plans.forEach((p) => {
let d = new Date(p.startDate)
p.date = new Date(
d.getFullYear(),
d.getMonth(),
d.getDate(),
0
).getTime()
switch (new Date(p.date).getHours()) {
case 0:
p.type = 'breakfast'
break
case 5:
p.type = 'lunch'
break
case 10:
p.type = 'dinner'
break
case 15:
p.type = 'snacks'
break
}
delete p.startDate
delete p.endDate
delete p.eventColor
state.mealPlans.push(p)
})
mealPlansDB.updateDocument('mealPlans', {
mealPlans: state.mealPlans,
})
} else state.mealPlans = [...plans]
} else {
mealPlansDB.createDocument(
{
mealPlans: [],
},
'mealPlans'
if (!state.mealPlans.length)
db.select(`SELECT * FROM mealPlans`).then((res) =>
res.forEach((m: {}) => state.mealPlans.push(m))
)
}
},
importMealPlans(state, mealPlans) {
importMealPlansFromJSON(state, mealPlans) {
let newMealPlans = mealPlans.filter((e) => {
if (e.hasOwnProperty('eventColor')) {
return !state.mealPlans.some((f) => {
@ -638,46 +813,66 @@ export default new Vuex.Store({
})
}
state.mealPlans = [...state.mealPlans, ...updatedMealPlans]
mealPlansDB.updateDocument('mealPlans', { mealPlans: state.mealPlans })
updatedMealPlans.forEach((m) => {
db.execute(
`INSERT INTO mealPlans (date, type, title) VALUES (?, ?, ?)`,
[m.date, m.type, m.title]
)
})
},
addMealPlan(state, { title, date, type, index }) {
importMealPlansFromDB(state, mealPlans) {
let newMealPlans = mealPlans.filter(
(e) =>
!state.mealPlans.some((f) =>
Object.keys(f).every((key) => f[key] == e[key])
)
)
state.mealPlans = [...state.mealPlans, ...newMealPlans]
newMealPlans.forEach((m) => {
db.execute(
`INSERT INTO mealPlans (date, type, title) VALUES (?, ?, ?)`,
[m.date, m.type, m.title]
)
})
},
addMealPlan(state, { date, type, title }) {
let mealPlan = {
title,
date,
type,
title,
}
if (index != null) state.mealPlans.splice(index, 0, mealPlan)
else state.mealPlans.push(mealPlan)
mealPlansDB.updateDocument('mealPlans', {
mealPlans: [...state.mealPlans],
})
state.mealPlans.push(mealPlan)
const cols = Object.keys(mealPlan).join(', ')
const placeholder = Object.keys(mealPlan)
.fill('?')
.join(', ')
db.execute(
`INSERT INTO mealPlans (${cols}) VALUES (${placeholder})`,
Object.values(mealPlan)
)
},
deleteMealPlan(state, { title, date, type, index }) {
deleteMealPlan(state, { date, type, title }) {
let index = state.mealPlans.findIndex(
(e) => e.title === title && e.type === type && e.date === date
)
state.mealPlans.splice(index, 1)
state.mealPlans = [...state.mealPlans]
mealPlansDB.updateDocument('mealPlans', {
mealPlans: [...state.mealPlans],
})
},
toggleState(state, { id, recipe, key, setDate }) {
let index = state.recipes.indexOf(
state.recipes.filter((e) => e.id === id)[0]
db.execute(
`DELETE FROM mealPlans WHERE date = ${date} AND type = '${type}' AND title = '${title}'`
)
state.recipes[index][key] = !state.recipes[index][key]
if (setDate) state.recipes[index].lastTried = new Date()
EnRecipesDB.updateDocument(id, recipe)
},
setRecipeAsTried(state, { id, recipe }) {
let index = state.recipes.indexOf(
state.recipes.filter((e) => e.id === id)[0]
toggleState(state, { id, key, setDate }) {
let index = state.recipes.findIndex((e) => e.id == id)
state.recipes[index][key] = state.recipes[index][key] ? 0 : 1
db.execute(
`UPDATE recipes SET ${key} = ${state.recipes[index][key]} WHERE id = '${id}'`
)
state.recipes[index].tried = true
state.recipes[index].lastTried = new Date()
EnRecipesDB.updateDocument(id, recipe)
},
setLastTriedDate(state, index) {
state.recipes[index].lastTried = new Date()
EnRecipesDB.updateDocument(state.recipes[index].id, state.recipes[index])
if (setDate) {
state.recipes[index].lastTried = new Date().getTime()
db.execute(
`UPDATE recipes SET lastTried = ${state.recipes[index].lastTried} WHERE id = '${id}'`
)
}
},
setComponent(state, comp) {
state.currentComponent = comp
@ -686,7 +881,11 @@ export default new Vuex.Store({
state.recipes.forEach((e, i) => {
if (combinations.includes(e.id)) {
state.recipes[i].combinations.splice(e.combinations.indexOf(id), 1)
EnRecipesDB.updateDocument(state.recipes[i].id, state.recipes[i])
db.execute(
`UPDATE recipes SET combinations = '${JSON.stringify(
state.recipes[i].combinations
)}' WHERE id = '${id}'`
)
}
})
},
@ -694,26 +893,23 @@ export default new Vuex.Store({
state.shakeEnabled = shake
ApplicationSettings.setBoolean('shakeEnabled', shake)
},
setRating(state, { id, recipe, rating }) {
let index = state.recipes.indexOf(
state.recipes.filter((e) => e.id === id)[0]
)
setRating(state, { id, rating }) {
let index = state.recipes.findIndex((e) => e.id == id)
state.recipes[index].rating = rating
EnRecipesDB.updateDocument(id, recipe)
db.execute(`UPDATE recipes SET rating = ${rating} WHERE id = '${id}'`)
},
toggleCart(state, { id, recipe }) {
toggleCart(state, { id }) {
let index = state.recipes.indexOf(
state.recipes.filter((e) => e.id === id)[0]
)
state.recipes[index].inBag = !state.recipes[index].inBag
EnRecipesDB.updateDocument(id, recipe)
},
unlinkBrokenImages(state) {
state.recipes.forEach((r, i) => {
if (r.imageSrc && !File.exists(r.imageSrc)) {
r.imageSrc = null
if (r.image && !File.exists(r.image)) {
r.image = null
Object.assign(state.recipes[i], r)
EnRecipesDB.updateDocument(r.id, r)
db.execute(`UPDATE recipes SET image = null WHERE id = '${r.id}'`)
}
})
},
@ -728,6 +924,33 @@ export default new Vuex.Store({
},
},
actions: {
addTimerPreset({ commit }, timer) {
commit('addTimerPreset', timer)
},
removeTimerPreset({ commit }, timer) {
commit('removeTimerPreset', timer)
},
clearTimerInterval({ commit }) {
commit('clearTimerInterval')
},
addActiveTimer({ commit }, timer) {
commit('addActiveTimer', timer)
},
updateActiveTimer({ commit }, timer) {
commit('updateActiveTimer', timer)
},
removeActiveTimer({ commit }, index) {
commit('removeActiveTimer', index)
},
setTimerDelay({ commit }, delay) {
commit('setTimerDelay', delay)
},
setTimerSound({ commit }, sound) {
commit('setTimerSound', sound)
},
setTimerVibrate({ commit }, bool) {
commit('setTimerVibrate', bool)
},
clearImportSummary({ commit }) {
commit('clearImportSummary')
},
@ -749,25 +972,22 @@ export default new Vuex.Store({
initRecipes({ commit }) {
commit('initRecipes')
},
importRecipesAction({ commit }, recipes) {
commit('importRecipes', recipes)
importRecipesFromJSON({ commit }, recipes) {
commit('importRecipesFromJSON', recipes)
},
importRecipesFromDB({ commit }, recipes) {
commit('importRecipesFromDB', recipes)
},
addRecipeAction({ commit }, recipe) {
commit('addRecipe', recipe)
},
overwriteRecipeAction({ commit }, updatedRecipe) {
commit('overwriteRecipe', updatedRecipe)
},
deleteRecipeAction({ commit }, recipe) {
commit('deleteRecipe', recipe)
},
deleteRecipesAction({ commit }, ids) {
deleteRecipes({ commit }, ids) {
commit('deleteRecipes', ids)
},
initListItems({ commit }) {
commit('initListItems')
},
importListItemsAction({ commit }, data) {
importListItems({ commit }, data) {
commit('importListItems', data)
},
addListItemAction({ commit }, item) {
@ -782,8 +1002,11 @@ export default new Vuex.Store({
initMealPlans({ commit }) {
commit('initMealPlans')
},
importMealPlansAction({ commit }, mealPlans) {
commit('importMealPlans', mealPlans)
importMealPlansFromJSON({ commit }, mealPlans) {
commit('importMealPlansFromJSON', mealPlans)
},
importMealPlansFromDB({ commit }, mealPlans) {
commit('importMealPlansFromDB', mealPlans)
},
addMealPlanAction({ commit }, mealPlan) {
commit('addMealPlan', mealPlan)
@ -794,12 +1017,6 @@ export default new Vuex.Store({
toggleStateAction({ commit }, toggledRecipe) {
commit('toggleState', toggledRecipe)
},
setRecipeAsTriedAction({ commit }, recipe) {
commit('setRecipeAsTried', recipe)
},
setLastTriedDateAction({ commit }, index) {
commit('setLastTriedDate', index)
},
setComponent({ commit }, comp) {
commit('setComponent', comp)
},

View file

@ -1,3 +0,0 @@
- You can now choose a system default theme to follow your device's dark mode setting (for Android 10 and above)
- Cooking timer tool has been added
- Individual settings page for each tool

View file

@ -1,7 +1,7 @@
import { NativeScriptConfig } from "@nativescript/core"
export default {
id: "com.vishnuraghav.enrecipes",
id: "com.vishnuraghav.EnRecipes",
appPath: "app",
appResourcesPath: "app/resources",
android: {

665
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,8 @@
{
"name": "enrecipes",
"main": "./app/main.ts",
"version": "1.0.0",
"description": "A native application built with NativeScript-Vue",
"version": "2.0.0",
"description": "EnRecipes is an open source, privacy-friendly digital cookbook that lets you create, manage and share your recipes.",
"homepage": "https://enrecipes.vercel.app/",
"bugs": {
"url": "https://github.com/vishnuraghavb/EnRecipes/issues"
@ -18,23 +18,24 @@
},
"private": "true",
"dependencies": {
"@akylas/nativescript-sqlite": "^3.3.12",
"@nativescript-community/ui-collectionview": "^4.0.29",
"@nativescript/core": "~8.0.1",
"@nativescript/core": "^8.0.5",
"@nativescript/local-notifications": "^5.0.3",
"@nativescript/localize": "^5.0.4",
"@triniwiz/nativescript-accelerometer": "^4.0.3",
"@triniwiz/nativescript-couchbase": "^1.2.2",
"nativescript-imagecropper": "^4.0.1",
"nativescript-intl": "^4.0.2",
"nativescript-vue": "~2.9.0",
"nativescript-vue": "^2.9.0",
"vuex": "^3.6.2"
},
"devDependencies": {
"@nativescript/android": "8.0.0",
"@nativescript/types-android": "^8.0.0",
"@nativescript/types": "^8.0.1",
"@nativescript/webpack": "beta",
"@types/node": "^14.14.37",
"@types/node": "^15.3.0",
"nativescript-vue-template-compiler": "~2.9.0",
"sass": "^1.32.8",
"sass": "^1.32.13",
"typescript": "^4.2.4",
"vue": "^2.6.12"
}

View file

@ -6,7 +6,7 @@
"lib": ["dom", "es2017"],
"sourceMap": true,
"noEmitHelpers": true,
"importHelpers": true,
"importHelpers": false, // Must be false to create custom android componentt
"baseUrl": ".",
"paths": {
"~/*": ["app/*"],

View file

@ -1 +1 @@
/// <reference path="../node_modules/@nativescript/types-android/index.d.ts" />
/// <reference path="../node_modules/@nativescript/types/index.d.ts" />

View file

@ -1,6 +1,20 @@
const webpack = require('@nativescript/webpack')
const path = require('path')
module.exports = (env) => {
webpack.init(env)
const platform = webpack.Utils.platform.getPlatformName()
webpack.chainWebpack((config) => {
if (platform === 'android') {
const appComponents = [
'@nativescript/core/ui/frame',
'@nativescript/core/ui/frame/activity',
path.resolve(__dirname, 'app/ForegroundService.js'),
]
appComponents.map((component) => {
config.entry('bundle').add(component)
})
}
})
return webpack.resolveConfig()
}