various fixes and improvements

This commit is contained in:
vabene1111
2025-05-27 16:53:10 +02:00
parent 40a7db086f
commit fa8af5596f
47 changed files with 410 additions and 38 deletions

View File

@@ -4,7 +4,7 @@
</v-app-bar>
<v-app-bar :color="useUserPreferenceStore().userSettings.navBgColor" flat density="comfortable" v-if="useUserPreferenceStore().isAuthenticated">
<router-link :to="{ name: 'view_home', params: {} }">
<router-link :to="{ name: 'StartPage', params: {} }">
<v-img src="../../assets/brand_logo.svg" width="140px" class="ms-2" v-if="useUserPreferenceStore().userSettings.navShowLogo"></v-img>
</router-link>
<v-spacer></v-spacer>
@@ -120,7 +120,7 @@
<v-list-item-subtitle>{{ useUserPreferenceStore().activeSpace.name }}</v-list-item-subtitle>
</v-list-item>
<v-divider></v-divider>
<v-list-item prepend-icon="$recipes" title="Home" :to="{ name: 'view_home', params: {} }"></v-list-item>
<v-list-item prepend-icon="$recipes" title="Home" :to="{ name: 'StartPage', params: {} }"></v-list-item>
<v-list-item prepend-icon="$search" :title="$t('Search')" :to="{ name: 'SearchPage' }"></v-list-item>
<v-list-item prepend-icon="$mealplan" :title="$t('Meal_Plan')" :to="{ name: 'MealPlanPage', params: {} }"></v-list-item>
<v-list-item prepend-icon="$shopping" :title="$t('Shopping_list')" :to="{ name: 'ShoppingListPage', params: {} }"></v-list-item>
@@ -144,7 +144,7 @@
</v-navigation-drawer>
<v-bottom-navigation grow v-if="useUserPreferenceStore().isAuthenticated && !lgAndUp">
<v-btn value="recent" :to="{ name: 'view_home', params: {} }">
<v-btn value="recent" :to="{ name: 'StartPage', params: {} }">
<v-icon icon="fa-fw fas fa-book "/>
</v-btn>
@@ -163,6 +163,7 @@
<v-list-item prepend-icon="fa-solid fa-sliders" :to="{ name: 'SettingsPage', params: {} }" :title="$t('Settings')"></v-list-item>
<v-list-item prepend-icon="fas fa-globe" :title="$t('Import')" :to="{ name: 'RecipeImportPage', params: {} }"></v-list-item>
<v-list-item prepend-icon="fa-solid fa-folder-tree" :to="{ name: 'ModelListPage', params: {model: 'food'} }" :title="$t('Database')"></v-list-item>
<v-list-item prepend-icon="$books" :title="$t('Books')" :to="{ name: 'BooksPage', params: {} }"></v-list-item>
</v-list>
</v-bottom-sheet>
</v-btn>

View File

@@ -14,8 +14,8 @@ import {setupI18n} from "@/i18n";
import MealPlanPage from "@/pages/MealPlanPage.vue";
const routes = [
{path: '/', component: () => import("@/pages/StartPage.vue"), name: 'view_home'},
{path: '/search', redirect: {name: 'view_home'}},
{path: '/', component: () => import("@/pages/StartPage.vue"), name: 'StartPage'},
{path: '/search', redirect: {name: 'StartPage'}},
{path: '/test', component: () => import("@/pages/TestPage.vue"), name: 'view_test'},
{path: '/help', component: () => import("@/pages/HelpPage.vue"), name: 'HelpPage'},
{

View File

@@ -165,7 +165,7 @@ const showDetailDialog = ref(false)
*/
function addTestMessage() {
let types = [MessageType.SUCCESS, MessageType.ERROR, MessageType.INFO, MessageType.WARNING]
useMessageStore().addMessage(types[Math.floor(Math.random() * types.length)], {title: 'Test', text: `Lorem Ipsum ${Math.random() * 1000}`}, 5000, {json: "data", 'msg': 'whatever', data: 1})
useMessageStore().addMessage(types[Math.floor(Math.random() * types.length)], {title: 'Test', text: `Lorem Ipsum Lorem Ipsum Lorem Ipsum LINEBREAK \n Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum Lorem Ipsum ${Math.random() * 1000}`}, 5000, {json: "data", 'msg': 'whatever', data: 1})
}
</script>

View File

@@ -8,6 +8,7 @@
:sub-title="ingredientToString(step.ingredients[editingIngredientIndex])"></v-closable-card-title>
<v-card-text>
<template v-if="step.ingredients.length > 1">
{{$t('Order')}}
<v-btn block :disabled="editingIngredientIndex== 0" @click="moveIngredient(editingIngredientIndex, props.stepIndex, 0)">{{ $t('First') }}</v-btn>
<v-btn block :disabled="editingIngredientIndex == 0" class="mt-1" @click="moveIngredient(editingIngredientIndex, props.stepIndex, editingIngredientIndex - 1)">
{{
@@ -22,7 +23,7 @@
</v-btn>
</template>
{{ $t('Step') }}
{{ $t('MoveToStep') }}
<v-btn block v-for="(s,i) in recipe.steps" :disabled="i == props.stepIndex" class="mt-1"
@click="moveIngredient(editingIngredientIndex, i, recipe.steps[i].ingredients.length)">{{ i + 1 }} <span v-if="'name' in s">{{ s.name }}</span>
</v-btn>

View File

@@ -12,7 +12,7 @@
>
<!-- <small>{{ DateTime.fromSeconds(visibleMessage.createdAt).toLocaleString(DateTime.DATETIME_MED) }}</small> <br/>-->
<h3 v-if="visibleMessage.msg.title">{{ visibleMessage.msg.title }}</h3>
<span class="text-pre">{{ visibleMessage.msg.text }}</span>
<span style="white-space: pre-wrap">{{ visibleMessage.msg.text }}</span>
<template #actions v-if="showViewButton">

View File

@@ -37,7 +37,7 @@
<v-row>
<v-col cols="12" md="6" v-if="showTime || step.time != 0">
<v-number-input :label="$t('Time')" v-model="step.time" :min="0" :step="5" control-variant="split" ></v-number-input>
<v-number-input :label="$t('Time')" v-model="step.time" :min="0" :step="5" control-variant="split"></v-number-input>
</v-col>
<v-col cols="12" md="6" v-if="showRecipe || step.stepRecipe != null">
<model-select model="Recipe" v-model="step.stepRecipe" :object="false" append-to-body></model-select>
@@ -51,9 +51,14 @@
<v-col cols="12">
<v-label>{{ $t('Ingredients') }}</v-label>
<div v-if="!mobile">
<vue-draggable v-model="step.ingredients" handle=".drag-handle" :on-sort="sortIngredients" empty-insert-threshold="25" group="ingredients">
<vue-draggable v-model="step.ingredients" handle=".drag-handle" :on-sort="sortIngredients" :empty-insert-threshold="25" group="ingredients">
<v-row v-for="(ingredient, index) in step.ingredients" dense>
<v-col cols="2" v-if="!ingredient.isHeader">
<v-input hide-details>
<template #prepend>
<v-icon icon="$dragHandle" class="drag-handle cursor-grab" v-if="ingredient.noAmount" density="compact"></v-icon>
</template>
</v-input>
<v-text-field :id="`id_input_amount_${step.id}_${index}`" :label="$t('Amount')" type="number" v-model="ingredient.amount" density="compact"
hide-details v-if="!ingredient.noAmount">
@@ -92,8 +97,8 @@
}}
</v-list-item>
<v-list-item v-if="ingredient.originalText" prepend-icon="$import">
<v-list-item-title>{{$t('Original_Text')}}</v-list-item-title>
<v-list-item-subtitle>{{ ingredient.originalText}}</v-list-item-subtitle>
<v-list-item-title>{{ $t('Original_Text') }}</v-list-item-title>
<v-list-item-subtitle>{{ ingredient.originalText }}</v-list-item-subtitle>
</v-list-item>
</v-list>
</v-menu>
@@ -174,14 +179,16 @@
</v-card>
</v-dialog>
<step-ingredient-sorter-dialog :step-index="props.stepIndex" :step="step" :recipe="recipe" v-model="dialogIngredientSorter" :ingredient-index="editingIngredientIndex"></step-ingredient-sorter-dialog>
<step-ingredient-sorter-dialog :step-index="props.stepIndex" :step="step" :recipe="recipe" v-model="dialogIngredientSorter"
:ingredient-index="editingIngredientIndex"></step-ingredient-sorter-dialog>
<v-bottom-sheet v-model="dialogIngredientEditor">
<v-card v-if="editingIngredientIndex >= 0">
<v-closable-card-title :title="$t('Ingredient Editor')" v-model="dialogIngredientEditor"></v-closable-card-title>
<v-card-text>
<v-form>
<v-text-field :label="$t('Original_Text')" readonly v-model="step.ingredients[editingIngredientIndex].originalText" v-if="step.ingredients[editingIngredientIndex].originalText"></v-text-field>
<v-text-field :label="$t('Original_Text')" readonly v-model="step.ingredients[editingIngredientIndex].originalText"
v-if="step.ingredients[editingIngredientIndex].originalText"></v-text-field>
<v-number-input v-model="step.ingredients[editingIngredientIndex].amount" inset control-variant="stacked" autofocus :label="$t('Amount')"
:min="0" :precision="2" v-if="!step.ingredients[editingIngredientIndex].isHeader"></v-number-input>
<model-select model="Unit" v-model="step.ingredients[editingIngredientIndex].unit" :label="$t('Unit')" v-if="!step.ingredients[editingIngredientIndex].isHeader"

View File

@@ -63,7 +63,8 @@
</v-col>
</v-row>
<closable-help-alert :text="$t('RecipeStepsHelp')" :action-text="$t('Steps')" @click="tab='steps'"></closable-help-alert>
<!-- <closable-help-alert :text="$t('RecipeStepsHelp')" :action-text="$t('Steps')" @click="tab='steps'"></closable-help-alert>-->
<v-btn @click="tab='steps'" class="float-right" variant="tonal" append-icon="fa-solid fa-arrow-right">{{$t('Steps')}} </v-btn>
</v-form>
</v-tabs-window-item>
@@ -95,7 +96,7 @@
</v-tabs-window-item>
<v-tabs-window-item value="settings">
<v-form :disabled="loading || fileApiLoading">
<v-checkbox :label="$t('Ingredient Overview')" :hint="$t('show_ingredient_overview')" persistent-hint
<v-checkbox :label="$t('show_ingredient_overview')"
v-model="editingObj.showIngredientOverview"></v-checkbox>
<v-text-field :label="$t('Imported_From')" v-model="editingObj.sourceUrl"></v-text-field>

View File

@@ -207,7 +207,6 @@ export function useModelEditorFunctions<T>(modelName: EditorSupportedModels, emi
return modelClass.value.destroy(editingObj.value.id).then((r: any) => {
emit('delete', editingObj.value)
console.log('deleted')
editingObj.value = {} as T
}).catch((err: any) => {
useMessageStore().addError(ErrorMessageType.DELETE_ERROR, err)

View File

@@ -111,6 +111,7 @@
"Enable_Amount": "",
"Energy": "",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "",
"Export_As_ICal": "",
"Export_Not_Yet_Supported": "",
@@ -209,6 +210,7 @@
"More": "",
"Move": "",
"MoveCategory": "",
"MoveToStep": "",
"Move_Down": "",
"Move_Food": "",
"Move_Keyword": "",
@@ -277,6 +279,8 @@
"QuickEntry": "",
"Random Recipes": "",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "",
"Ratings": "",
"Recently_Viewed": "",
@@ -383,6 +387,8 @@
"Update": "",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "",
"Use_Plural_Food_Always": "",
"Use_Plural_Food_Simple": "",

View File

@@ -108,6 +108,7 @@
"Enable_Amount": "Активиране на сумата",
"Energy": "Енергия",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "Експортиране",
"Export_As_ICal": "Експортирайте текущия период във формат iCal",
"Export_Not_Yet_Supported": "Експортирането все още не се поддържа",
@@ -203,6 +204,7 @@
"More": "",
"Move": "Премести",
"MoveCategory": "Премести към: ",
"MoveToStep": "",
"Move_Down": "Премести надолу",
"Move_Food": "Преместете храната",
"Move_Keyword": "Преместване на ключова дума",
@@ -270,6 +272,8 @@
"QuickEntry": "Бързо влизане",
"Random Recipes": "Случайни рецепти",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Рейтинг",
"Ratings": "Рейтинги",
"Recently_Viewed": "Наскоро разгледани",
@@ -376,6 +380,8 @@
"Update": "",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Импортиране на URL адрес",
"Use_Plural_Food_Always": "",
"Use_Plural_Food_Simple": "",

View File

@@ -146,6 +146,7 @@
"Energy": "",
"Entries": "",
"Error": "",
"ErrorUrlListImport": "",
"Export": "",
"Export_As_ICal": "",
"Export_Not_Yet_Supported": "",
@@ -259,6 +260,7 @@
"More": "",
"Move": "",
"MoveCategory": "",
"MoveToStep": "",
"Move_Down": "Moveu avall",
"Move_Food": "",
"Move_Keyword": "Moveu la paraula clau",
@@ -344,6 +346,8 @@
"QuickEntry": "",
"Random Recipes": "",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "",
"Ratings": "",
"Recently_Viewed": "Vistos recentment",
@@ -471,6 +475,8 @@
"Updated": "",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importeu des d'url",
"Use_Fractions": "",
"Use_Fractions_Help": "",

View File

@@ -146,6 +146,7 @@
"Energy": "Energie",
"Entries": "",
"Error": "Chyba",
"ErrorUrlListImport": "",
"Export": "Export",
"Export_As_ICal": "Exportovat současný úsek do formátu iCal",
"Export_Not_Yet_Supported": "Export není zatím podporován",
@@ -258,6 +259,7 @@
"More": "",
"Move": "Přesunout",
"MoveCategory": "Přesunout do: ",
"MoveToStep": "",
"Move_Down": "Dolů",
"Move_Food": "Přesunout potravinu",
"Move_Keyword": "Přesunout štítek",
@@ -342,6 +344,8 @@
"QuickEntry": "Rychlý záznam",
"Random Recipes": "Náhodné recepty",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Hodnocení",
"Ratings": "Hodnocení",
"Recently_Viewed": "Naposledy prohlížené",
@@ -464,6 +468,8 @@
"Update_Existing_Data": "Aktualizovat existující data",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Import pomocí URL odkazu",
"Use_Fractions": "Použít zlomky",
"Use_Fractions_Help": "Automaticky převézt desetinná čísla na zlomky při prohlížení repetu.",

View File

@@ -135,6 +135,7 @@
"EndDate": "Slutdato",
"Energy": "Energi",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "Eksporter",
"Export_As_ICal": "Eksporter nuværende periode til iCal format",
"Export_Not_Yet_Supported": "Eksport endnu ikke understøttet",
@@ -245,6 +246,7 @@
"More": "",
"Move": "Flyt",
"MoveCategory": "Flyt til: ",
"MoveToStep": "",
"Move_Down": "Flyt ned",
"Move_Food": "Flyt mad",
"Move_Keyword": "Flyt nøgleord",
@@ -326,6 +328,8 @@
"QuickEntry": "Hurtigt indlæg",
"Random Recipes": "Tilfældige opskrifter",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Bedømmelse",
"Ratings": "Bedømmelser",
"Recently_Viewed": "Vist for nylig",
@@ -444,6 +448,8 @@
"Update_Existing_Data": "Opdaterer eksisterende data",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importer fra link",
"Use_Fractions": "Benyt brøker",
"Use_Fractions_Help": "Konverter automatisk decimaler til brøker når du viser en opskrift.",

View File

@@ -149,6 +149,7 @@
"Energy": "Energie",
"Entries": "Einträge",
"Error": "Fehler",
"ErrorUrlListImport": "Beim importieren der obersten URL in der Liste ist ein Fehler aufgetreten. Alle URLs die nicht mehr in der Liste sind wurden importiert.",
"Export": "Exportieren",
"Export_As_ICal": "Aktuellen Zeitraum im iCal Format exportieren",
"Export_Not_Yet_Supported": "Exportieren wird noch nicht unterstützt",
@@ -262,6 +263,7 @@
"More": "Mehr",
"Move": "Verschieben",
"MoveCategory": "Verschieben nach: ",
"MoveToStep": "Verschieben in Schritt",
"Move_Down": "Runter",
"Move_Food": "Lebensmittel verschieben",
"Move_Keyword": "Schlagwort verschieben",
@@ -348,6 +350,8 @@
"QuickEntry": "Einfach",
"Random Recipes": "Zufällige Rezepte",
"RandomOrder": "Zufällige Reihenfolge",
"RateLimit": "Rate Limit",
"RateLimitHelp": "Das Limit der erlaubten Anfragen in einer bestimmten Zeit wurde erreicht.",
"Rating": "Bewertung",
"Ratings": "Bewertungen",
"Recently_Viewed": "Kürzlich angesehen",
@@ -475,6 +479,8 @@
"Updated": "Aktualisiert",
"UpgradeNow": "Jetzt Upgraden",
"UrlImportSubtitle": "Importiere Rezepte von tausenden unterstützten Seiten.",
"UrlList": "URL Liste",
"UrlListSubtitle": "Automatischer Import einer Liste von Urls",
"Url_Import": "URL Import",
"Use_Fractions": "Bruchschreibweise verwenden",
"Use_Fractions_Help": "Nachkommastellen automatisch in Bruchschreibweise konvertieren, wenn ein Rezept angeschaut wird.",

View File

@@ -133,6 +133,7 @@
"Enable_Amount": "Ενεργοποίηση ποσότητας",
"Energy": "Ενέργεια",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "Εξαγωγή",
"Export_As_ICal": "Εξαγωγή της τρέχουσας περιόδου σε μορφή iCal",
"Export_Not_Yet_Supported": "Η εξαγωγή δεν υποστηρίζεται ακόμη",
@@ -240,6 +241,7 @@
"More": "",
"Move": "Μετακίνηση",
"MoveCategory": "Μετακίνηση σε: ",
"MoveToStep": "",
"Move_Down": "Μετακίνηση κάτω",
"Move_Food": "Μετακίνηση φαγητού",
"Move_Keyword": "Μεταφορά λέξης-κλειδί",
@@ -318,6 +320,8 @@
"QuickEntry": "Γρήγορη καταχώρηση",
"Random Recipes": "Τυχαίες συνταγές",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Βαθμολογία",
"Ratings": "Βαθμολογίες",
"Recently_Viewed": "Προβλήθηκαν πρόσφατα",
@@ -433,6 +437,8 @@
"Update_Existing_Data": "Ενημέρωση υπαρχόντων δεδομένων",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Εισαγωγή Url",
"Use_Fractions": "Χρήση κλασμάτων",
"Use_Fractions_Help": "Αυτόματη μετατροπή δεκαδικών σε κλάσματα κατά την προβολή μιας συνταγής.",

View File

@@ -147,6 +147,7 @@
"Energy": "Energy",
"Entries": "Entries",
"Error": "Error",
"ErrorUrlListImport": "An error occured during import of the first URL in the list. All URLs no longer shown have been imported successfully. ",
"Export": "Export",
"Export_As_ICal": "Export current period to iCal format",
"Export_Not_Yet_Supported": "Export not yet supported",
@@ -260,6 +261,7 @@
"More": "More",
"Move": "Move",
"MoveCategory": "Move To: ",
"MoveToStep": "Move to Step",
"Move_Down": "Move down",
"Move_Food": "Move Food",
"Move_Keyword": "Move Keyword",
@@ -346,6 +348,8 @@
"QuickEntry": "Quick Entry",
"Random Recipes": "Random Recipes",
"RandomOrder": "Random order",
"RateLimit": "Rate limit",
"RateLimitHelp": "You have reached the limit of requests in a certain time.",
"Rating": "Rating",
"Ratings": "Ratings",
"Recently_Viewed": "Recently Viewed",
@@ -473,6 +477,8 @@
"Updated": "Updated",
"UpgradeNow": "Upgrade now",
"UrlImportSubtitle": "Import recipes from thousands of suppported pages.",
"UrlList": "URL List",
"UrlListSubtitle": "Automatically import a list of urls",
"Url_Import": "Url Import",
"Use_Fractions": "Use Fractions",
"Use_Fractions_Help": "Automatically convert decimals to fractions when viewing a recipe.",

View File

@@ -147,6 +147,7 @@
"Energy": "Energia",
"Entries": "",
"Error": "Error",
"ErrorUrlListImport": "",
"Export": "Exportar",
"Export_As_ICal": "Exportar el periodo actual en formato iCal",
"Export_Not_Yet_Supported": "Exportación no soportada todavía",
@@ -260,6 +261,7 @@
"More": "",
"Move": "Mover",
"MoveCategory": "Mover a: ",
"MoveToStep": "",
"Move_Down": "mover abajo",
"Move_Food": "Mover ingediente",
"Move_Keyword": "Mover palabra clave",
@@ -344,6 +346,8 @@
"QuickEntry": "Entrada Rápida",
"Random Recipes": "Recetas Aleatorias",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Puntuación",
"Ratings": "Calificaciones",
"Recently_Viewed": "Visto recientemente",
@@ -471,6 +475,8 @@
"Updated": "Actualizada",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importar desde url",
"Use_Fractions": "Use fracciones",
"Use_Fractions_Help": "Convertir automáticamente los decimales en fracciones al ver una receta.",

View File

@@ -87,6 +87,7 @@
"Enable_Amount": "Ota Määrä käyttöön",
"Energy": "Energia",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "Vie",
"Export_As_ICal": "Vie nykyinen jakso iCal muotoon",
"Export_To_ICal": "Vie .ics",
@@ -157,6 +158,7 @@
"Month": "Kuukausi",
"More": "",
"Move": "Siirry",
"MoveToStep": "",
"Move_Down": "Siirry alas",
"Move_Food": "Siirrä ruoka",
"Move_Keyword": "Siirrä Avainsana",
@@ -208,6 +210,8 @@
"Property_Editor": "",
"Proteins": "Proteiinit",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Luokitus",
"Recently_Viewed": "Äskettäin katsotut",
"Recipe": "Resepti",
@@ -297,6 +301,8 @@
"Update": "",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "URL Tuonti",
"Use_Plural_Food_Always": "",
"Use_Plural_Food_Simple": "",

View File

@@ -146,6 +146,7 @@
"Energy": "Énergie",
"Entries": "",
"Error": "Erreur",
"ErrorUrlListImport": "",
"Export": "Exporter",
"Export_As_ICal": "Exporter la période en cours au format iCal",
"Export_Not_Yet_Supported": "Exportation pas encore prise en charge",
@@ -259,6 +260,7 @@
"More": "",
"Move": "Déplacer",
"MoveCategory": "Déplacer vers : ",
"MoveToStep": "",
"Move_Down": "Descendre",
"Move_Food": "Déplacer laliment",
"Move_Keyword": "Déplacer le mot-clé",
@@ -344,6 +346,8 @@
"QuickEntry": "Entrée rapide",
"Random Recipes": "Recettes Aléatoires",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Note",
"Ratings": "Notes",
"Recently_Viewed": "Vu récemment",
@@ -470,6 +474,8 @@
"Updated": "Mis à jour",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importation de lurl",
"Use_Fractions": "Utiliser les fractions",
"Use_Fractions_Help": "Convertir les décimales en fractions automatiquement lors de la visualisation dune recette.",

View File

@@ -147,6 +147,7 @@
"Energy": "אנרגיה",
"Entries": "",
"Error": "שגיאה",
"ErrorUrlListImport": "",
"Export": "ייצוא",
"Export_As_ICal": "ייצוא תקופה נוכחית בפורמט iCal",
"Export_Not_Yet_Supported": "ייצוא לא נתמך עדיין",
@@ -260,6 +261,7 @@
"More": "",
"Move": "העברה",
"MoveCategory": "העבר אל: ",
"MoveToStep": "",
"Move_Down": "העברה למטה",
"Move_Food": "העבר אוכל",
"Move_Keyword": "העברת מילת מפתח",
@@ -345,6 +347,8 @@
"QuickEntry": "רשומה מהירה",
"Random Recipes": "מתכון אקראי",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "דירוג",
"Ratings": "דירוג",
"Recently_Viewed": "נצפו לאחרונה",
@@ -472,6 +476,8 @@
"Updated": "עודכן",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "ייבוא מכתובת",
"Use_Fractions": "השתמש בשברים",
"Use_Fractions_Help": "המר אוטומטית מדצמילי לשברים כאשר צופים במתכון.",

View File

@@ -133,6 +133,7 @@
"EndDate": "Befejezés dátuma",
"Energy": "Energia",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "Export",
"Export_As_ICal": "Jelenlegi időszak exportálása iCal formátumba",
"Export_Not_Yet_Supported": "",
@@ -241,6 +242,7 @@
"More": "",
"Move": "Mozgatás",
"MoveCategory": "Áthelyezés ide: ",
"MoveToStep": "",
"Move_Down": "Lefelé mozgatás",
"Move_Food": "Alapanyag mozgatása",
"Move_Keyword": "Kulcsszó mozgatása",
@@ -320,6 +322,8 @@
"QuickEntry": "Gyors bevitel",
"Random Recipes": "Véletlenszerű receptek",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Értékelés",
"Ratings": "Értékelések",
"Recently_Viewed": "Nemrég megtekintett",
@@ -435,6 +439,8 @@
"Update_Existing_Data": "Meglévő adatok frissítése",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "URL import",
"Use_Fractions": "Tört használata",
"Use_Fractions_Help": "A receptek megtekintésekor a tizedesjegyeket automatikusan törtekre konvertálja.",

View File

@@ -70,6 +70,7 @@
"Empty": "Դատարկ",
"Energy": "",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "",
"External": "",
"External_Recipe_Image": "",
@@ -121,6 +122,7 @@
"Monday": "",
"More": "",
"Move": "Տեղափոխել",
"MoveToStep": "",
"Move_Food": "Տեղափոխել սննդամթերքը",
"Move_Keyword": "Տեղափոխել բանալի բառը",
"Name": "Անուն",
@@ -154,6 +156,8 @@
"Property_Editor": "",
"Proteins": "",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "",
"Recently_Viewed": "Վերջերս դիտած",
"Recipe": "Բաղադրատոմս",
@@ -227,6 +231,8 @@
"Update": "",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "URL ներմուծում",
"Use_Plural_Food_Always": "",
"Use_Plural_Food_Simple": "",

View File

@@ -122,6 +122,7 @@
"Enable_Amount": "Aktifkan Jumlah",
"Energy": "Energi",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "Ekspor",
"Export_As_ICal": "",
"Export_Not_Yet_Supported": "",
@@ -226,6 +227,7 @@
"More": "",
"Move": "Bergerak",
"MoveCategory": "",
"MoveToStep": "",
"Move_Down": "Pindahkan kebawah",
"Move_Food": "",
"Move_Keyword": "Pindahkan Kata Kunci",
@@ -297,6 +299,8 @@
"QuickEntry": "",
"Random Recipes": "",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Peringkat",
"Ratings": "",
"Recently_Viewed": "baru saja dilihat",
@@ -408,6 +412,8 @@
"Update": "",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Impor Url",
"Use_Fractions": "",
"Use_Fractions_Help": "",

View File

@@ -146,6 +146,7 @@
"Energy": "",
"Entries": "",
"Error": "",
"ErrorUrlListImport": "",
"Export": "",
"Export_As_ICal": "",
"Export_Not_Yet_Supported": "",
@@ -259,6 +260,7 @@
"More": "",
"Move": "",
"MoveCategory": "",
"MoveToStep": "",
"Move_Down": "",
"Move_Food": "",
"Move_Keyword": "",
@@ -344,6 +346,8 @@
"QuickEntry": "",
"Random Recipes": "",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "",
"Ratings": "",
"Recently_Viewed": "",
@@ -470,6 +474,8 @@
"Updated": "",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "",
"Use_Fractions": "",
"Use_Fractions_Help": "",

View File

@@ -127,6 +127,7 @@
"Enable_Amount": "Abilita Quantità",
"Energy": "Energia",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "Esporta",
"Export_As_ICal": "Esporta il periodo attuale in formato .iCal",
"Export_Not_Yet_Supported": "Esportazione non ancora supportata",
@@ -231,6 +232,7 @@
"More": "",
"Move": "Sposta",
"MoveCategory": "Sposta in: ",
"MoveToStep": "",
"Move_Down": "Sposta Sotto",
"Move_Food": "Sposta alimento",
"Move_Keyword": "Sposta parola chiave",
@@ -305,6 +307,8 @@
"QuickEntry": "Inserimento rapido",
"Random Recipes": "Ricette casuali",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Valutazione",
"Ratings": "Valutazioni",
"Recently_Viewed": "Visualizzato di recente",
@@ -419,6 +423,8 @@
"Update": "",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importa da URL",
"Use_Fractions": "Usa frazioni",
"Use_Fractions_Help": "Converti automaticamente i decimali in frazioni quando apri una ricetta.",

View File

@@ -135,6 +135,7 @@
"EndDate": "",
"Energy": "",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "",
"Export_As_ICal": "",
"Export_Not_Yet_Supported": "",
@@ -243,6 +244,7 @@
"More": "",
"Move": "",
"MoveCategory": "",
"MoveToStep": "",
"Move_Down": "Nuleisti žemyn",
"Move_Food": "",
"Move_Keyword": "Perkelti Raktažodį",
@@ -324,6 +326,8 @@
"QuickEntry": "",
"Random Recipes": "",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "",
"Ratings": "",
"Recently_Viewed": "Neseniai Žiūrėta",
@@ -442,6 +446,8 @@
"Update_Existing_Data": "",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "URL importavimas",
"Use_Fractions": "",
"Use_Fractions_Help": "",

View File

@@ -131,6 +131,7 @@
"Enable_Amount": "Aktiver mengde",
"Energy": "Energi",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "Eksporter",
"Export_As_ICal": "Eksporter gjeldende periode som iCal format",
"Export_Not_Yet_Supported": "",
@@ -238,6 +239,7 @@
"More": "",
"Move": "Flytt",
"MoveCategory": "Flytt til: ",
"MoveToStep": "",
"Move_Down": "Flytt ned",
"Move_Food": "Flytt Matrett",
"Move_Keyword": "Flytt nøkkelord",
@@ -316,6 +318,8 @@
"QuickEntry": "Hurtigregistrering",
"Random Recipes": "Tilfeldige oppskrifter",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Vurdering",
"Ratings": "",
"Recently_Viewed": "Nylig vist",
@@ -431,6 +435,8 @@
"Update_Existing_Data": "Oppdater eksisterende data",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importer lenke",
"Use_Fractions": "Bruk deler",
"Use_Fractions_Help": "Automatisk konverter desimaler til deler når du ser på en oppskrift.",

View File

@@ -135,6 +135,7 @@
"Enable_Amount": "Schakel hoeveelheid in",
"Energy": "Energie",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "Exporteren",
"Export_As_ICal": "Exporteer huidige periode naar iCal formaat",
"Export_Not_Yet_Supported": "Export nog niet ondersteund",
@@ -242,6 +243,7 @@
"More": "",
"Move": "Verplaats",
"MoveCategory": "Verplaats naar: ",
"MoveToStep": "",
"Move_Down": "Verplaats omlaag",
"Move_Food": "Verplaats Eten",
"Move_Keyword": "Verplaats Etiket",
@@ -320,6 +322,8 @@
"QuickEntry": "Snelle invoer",
"Random Recipes": "Willekeurige recepten",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Beoordeling",
"Ratings": "Waardering",
"Recently_Viewed": "Recent bekeken",
@@ -435,6 +439,8 @@
"Update_Existing_Data": "Bestaande gegevens bijwerken",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importeer URL",
"Use_Fractions": "Gebruik Kommagetallen",
"Use_Fractions_Help": "Zet decimalen automatisch om naar breuken tijdens het bekijken van een recept.",

View File

@@ -148,6 +148,7 @@
"Energy": "Energia",
"Entries": "",
"Error": "Błąd",
"ErrorUrlListImport": "",
"Export": "Eksport",
"Export_As_ICal": "Eksportuj bieżący okres do formatu iCal",
"Export_Not_Yet_Supported": "Eksportowanie jeszcze nie wspierane",
@@ -261,6 +262,7 @@
"More": "",
"Move": "Przenieś",
"MoveCategory": "Przenieś do: ",
"MoveToStep": "",
"Move_Down": "Przesunąć w dół",
"Move_Food": "Przenieś żywność",
"Move_Keyword": "Przenieś słowo kluczowe",
@@ -346,6 +348,8 @@
"QuickEntry": "Szybki wpis",
"Random Recipes": "Losowe przepisy",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Ocena",
"Ratings": "Oceny",
"Recently_Viewed": "Ostatnio oglądane",
@@ -473,6 +477,8 @@
"Updated": "Zaktualizowano",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importowanie URL",
"Use_Fractions": "Użyj ułamków",
"Use_Fractions_Help": "Automatycznie konwertuj ułamki dziesiętne na ułamki zwykłe podczas przeglądania przepisów.",

View File

@@ -112,6 +112,7 @@
"Enable_Amount": "Ativar quantidade",
"Energy": "Energia",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "Exportar",
"Export_As_ICal": "Exportar período atual para o formato ICal",
"Export_To_ICal": "Exportar .ics",
@@ -200,6 +201,7 @@
"More": "",
"Move": "Mover",
"MoveCategory": "Mover para: ",
"MoveToStep": "",
"Move_Down": "Mover para baixo",
"Move_Food": "Mover comida",
"Move_Keyword": "Mover palavra-chave",
@@ -267,6 +269,8 @@
"QuickEntry": "",
"Random Recipes": "Receitas Aleatórias",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Avaliação",
"Ratings": "Avaliações",
"Recently_Viewed": "Vistos Recentemente",
@@ -370,6 +374,8 @@
"Update": "",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importação de URL",
"Use_Fractions": "Usar frações",
"Use_Fractions_Help": "Converter automaticamente casas decimais para frações enquanto se visualiza uma receita.",

View File

@@ -142,6 +142,7 @@
"EndDate": "Data Fim",
"Energy": "Energia",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "Exportar",
"Export_As_ICal": "Exportar período atual para o formato iCal",
"Export_Not_Yet_Supported": "Exportação ainda não suportada",
@@ -253,6 +254,7 @@
"More": "",
"Move": "Mover",
"MoveCategory": "Mover Para: ",
"MoveToStep": "",
"Move_Down": "Mover para baixo",
"Move_Food": "Mover Comida",
"Move_Keyword": "Mover palavra-chave",
@@ -333,6 +335,8 @@
"QuickEntry": "",
"Random Recipes": "Receitas Aleatórias",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Nota",
"Ratings": "Classificações",
"Recently_Viewed": "Visto recentemente",
@@ -449,6 +453,8 @@
"Update_Existing_Data": "Atualizar Dados Existentes",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importar de URL",
"Use_Fractions": "Usar Frações",
"Use_Fractions_Help": "Automaticamente converter decimais para frações quando visualizando uma receita.",

View File

@@ -129,6 +129,7 @@
"Enable_Amount": "Activare cantitate",
"Energy": "Energie",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "Exportă",
"Export_As_ICal": "Exportul perioadei curente în format iCal",
"Export_Not_Yet_Supported": "Exportul încă nu este compatibil",
@@ -235,6 +236,7 @@
"More": "",
"Move": "Mută",
"MoveCategory": "Mută la: ",
"MoveToStep": "",
"Move_Down": "Deplasați-vă în jos",
"Move_Food": "Mutare mâncare",
"Move_Keyword": "Mută cuvânt cheie",
@@ -309,6 +311,8 @@
"QuickEntry": "Înscriere rapidă",
"Random Recipes": "Rețete aleatoare",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Evaluare",
"Ratings": "Evaluări",
"Recently_Viewed": "Vizualizate recent",
@@ -423,6 +427,8 @@
"Update": "",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importă URL",
"Use_Fractions": "Folosire fracțiuni",
"Use_Fractions_Help": "Convertiți automat zecimalele în fracții atunci când vizualizați o rețetă.",

View File

@@ -102,6 +102,7 @@
"Enable_Amount": "Активировать Количество",
"Energy": "Энергетическая ценность",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "Экспорт",
"Export_As_ICal": "Экспорт текущего периода в iCal формат",
"Export_To_ICal": "Экспортировать .ics",
@@ -189,6 +190,7 @@
"More": "",
"Move": "Переместить",
"MoveCategory": "Переместить в: ",
"MoveToStep": "",
"Move_Down": "Перенести вниз",
"Move_Food": "Переместить еду",
"Move_Keyword": "Перенести ключевое слово",
@@ -252,6 +254,8 @@
"Quick actions": "Быстрые действия",
"Random Recipes": "Случайные рецепты",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Рейтинг",
"Ratings": "Рейтинги",
"Recently_Viewed": "Недавно просмотренные",
@@ -351,6 +355,8 @@
"Update": "",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Импорт гиперссылки",
"User": "Пользователь",
"View": "Просмотр",

View File

@@ -102,6 +102,7 @@
"Enable_Amount": "Omogoči količino",
"Energy": "Energija",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "Izvoz",
"Export_As_ICal": "Izvozi trenutno obdobje v iCal format",
"Export_To_ICal": "Izvoz.ics",
@@ -185,6 +186,7 @@
"More": "",
"Move": "Premakni",
"MoveCategory": "Premakni v: ",
"MoveToStep": "",
"Move_Down": "Premakni navzdol",
"Move_Food": "Premakni hrano",
"Move_Keyword": "Premakni ključno besedo",
@@ -244,6 +246,8 @@
"Proteins": "Beljakovine",
"QuickEntry": "Hitri vnos",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Ocena",
"Recently_Viewed": "Nazadnje videno",
"Recipe": "Recept",
@@ -341,6 +345,8 @@
"Update_Existing_Data": "Posodobitev Obstoječih Podatkov",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "URL uvoz",
"Use_Metric": "Uporaba Metričnih Enot",
"Use_Plural_Food_Always": "",

View File

@@ -148,6 +148,7 @@
"Energy": "Energi",
"Entries": "",
"Error": "Fel",
"ErrorUrlListImport": "",
"Export": "Exportera",
"Export_As_ICal": "Exportera nuvarande period till iCal format",
"Export_Not_Yet_Supported": "Export stöds inte ännu",
@@ -261,6 +262,7 @@
"More": "",
"Move": "Flytta",
"MoveCategory": "Flytta till: ",
"MoveToStep": "",
"Move_Down": "Flytta ned",
"Move_Food": "Flytta livsmedel",
"Move_Keyword": "Flytta nyckelord",
@@ -346,6 +348,8 @@
"QuickEntry": "Snabbt inlägg",
"Random Recipes": "Slumpmässiga recept",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Betyg",
"Ratings": "Betyg",
"Recently_Viewed": "Nyligen visade",
@@ -473,6 +477,8 @@
"Updated": "Uppdaterad",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Länk import",
"Use_Fractions": "Använd bråk",
"Use_Fractions_Help": "Konvertera automatiskt decimaler till bråktal när du visar ett recept.",

View File

@@ -147,6 +147,7 @@
"Energy": "Enerji",
"Entries": "",
"Error": "Hata",
"ErrorUrlListImport": "",
"Export": "Dışa Aktar",
"Export_As_ICal": "Mevcut dönemi iCal formatında dışa aktar",
"Export_Not_Yet_Supported": "Dışa aktarma henüz desteklenmiyor",
@@ -260,6 +261,7 @@
"More": "",
"Move": "Taşı",
"MoveCategory": "Taşı: ",
"MoveToStep": "",
"Move_Down": "Aşağıya Taşı",
"Move_Food": "Yiyeceği Taşı",
"Move_Keyword": "Anahtar Kelimeyi Taşı",
@@ -345,6 +347,8 @@
"QuickEntry": "Hızlı Giriş",
"Random Recipes": "Rasgele Tarifler",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Puanlama",
"Ratings": "Derecelendirmeler",
"Recently_Viewed": "Son Görüntülenen",
@@ -472,6 +476,8 @@
"Updated": "Güncellendi",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Url İçeri Aktar",
"Use_Fractions": "Kesirleri Kullan",
"Use_Fractions_Help": "Bir tarifi görüntülerken ondalık sayıları otomatik olarak kesirlere dönüştürün.",

View File

@@ -117,6 +117,7 @@
"Enable_Amount": "Включити Кількість",
"Energy": "Енергія",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "Експорт",
"Export_As_ICal": "Експортувати теперішній період до формату iCal",
"Export_Not_Yet_Supported": "",
@@ -214,6 +215,7 @@
"More": "",
"Move": "Перемістити",
"MoveCategory": "Перемістити До: ",
"MoveToStep": "",
"Move_Down": "Перемістити вниз",
"Move_Food": "Перемістити Їжу",
"Move_Keyword": "Перемістити Ключове слово",
@@ -285,6 +287,8 @@
"QuickEntry": "",
"Random Recipes": "",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Рейтинг",
"Ratings": "",
"Recently_Viewed": "Нещодавно переглянуті",
@@ -392,6 +396,8 @@
"Update": "",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Імпорт за посиланням",
"Use_Fractions": "Використовувати дроби",
"Use_Fractions_Help": "Автоматично конвертувати десятки в дроби, коли дивитесь рецепт.",

View File

@@ -143,6 +143,7 @@
"EndDate": "结束日期",
"Energy": "能量",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "导出",
"Export_As_ICal": "将当前周期导出为 iCal 格式",
"Export_Not_Yet_Supported": "导入尚未支持",
@@ -256,6 +257,7 @@
"More": "",
"Move": "移动",
"MoveCategory": "移动到: ",
"MoveToStep": "",
"Move_Down": "下移",
"Move_Food": "移动食物",
"Move_Keyword": "移动关键词",
@@ -340,6 +342,8 @@
"QuickEntry": "快速入口",
"Random Recipes": "随机食谱",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "评分",
"Ratings": "等级",
"Recently_Viewed": "最近浏览",
@@ -463,6 +467,8 @@
"Update_Existing_Data": "更新现有数据",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "导入网址",
"Use_Fractions": "使用分数",
"Use_Fractions_Help": "查看食谱时自动将小数转换为分数。",

View File

@@ -58,6 +58,7 @@
"Email": "",
"Energy": "",
"Entries": "",
"ErrorUrlListImport": "",
"Export": "",
"External": "",
"External_Recipe_Image": "外部食譜圖片",
@@ -103,6 +104,7 @@
"MissingConversion": "",
"Monday": "",
"More": "",
"MoveToStep": "",
"New": "",
"New_Recipe": "",
"Next": "",
@@ -129,6 +131,8 @@
"Property_Editor": "",
"Proteins": "",
"RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "",
"Recently_Viewed": "",
"RecipeStepsHelp": "",
@@ -197,6 +201,8 @@
"Update": "",
"UpgradeNow": "",
"UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "",
"Use_Plural_Food_Always": "",
"Use_Plural_Food_Simple": "",

View File

@@ -12,7 +12,7 @@
</v-row>
<v-row>
<v-col>
<component :is="editorComponent" :item-id="id" @delete="router.go(-1)" @create="(obj: any) => objectCreated(obj)"></component>
<component :is="editorComponent" :item-id="id" @delete="objectDeleted" @create="(obj: any) => objectCreated(obj)"></component>
</v-col>
</v-row>
</v-container>
@@ -53,6 +53,17 @@ function objectCreated(obj: any) {
}
}
/**
* determines where to redirect user after object deletion based on selected model
*/
function objectDeleted(){
if (props.model.toLowerCase() == 'recipe'){
router.push({name : 'StartPage'})
} else {
router.go(-1)
}
}
</script>
<style scoped>

View File

@@ -73,7 +73,7 @@
@click="fdcSelectedIngredient = ingredient; fdcDialog = true"></v-btn>
<v-btn @click="updateFoodFdcData(ingredient)" icon="fa-solid fa-arrows-rotate" size="small" density="compact" variant="plain"
v-if="ingredient.food.fdcId"></v-btn>
<v-btn :href="`https://fdc.nal.usda.gov/food-details/${ingredient.food.fdcId}/nutrients`" target="_blank"
<v-btn @click="openFdcPage(ingredient.food.fdcId)" :href="`https://fdc.nal.usda.gov/food-details/${ingredient.food.fdcId}/nutrients`" target="_blank"
icon="fa-solid fa-arrow-up-right-from-square"
size="small" variant="plain" v-if="ingredient.food.fdcId"></v-btn>
</template>
@@ -381,6 +381,14 @@ function changeAllPropertyFoodAmounts(amount: number) {
})
}
/**
* for some reason v-btn href does not work in append inner slot of text field so open link with js
* @param fdcId
*/
function openFdcPage(fdcId: number){
window.open(`https://fdc.nal.usda.gov/food-details/${fdcId}/nutrients`, '_blank')
}
</script>
<style scoped>

View File

@@ -37,6 +37,12 @@
<v-stepper-item :title="$t('Bookmarklet')" value="bookmarklet" icon=" "></v-stepper-item>
</template>
<template v-if="importType == 'url-list'">
<v-stepper-item :title="$t('UrlList')" value="url_list_input" icon=" "></v-stepper-item>
<v-divider></v-divider>
<v-stepper-item :title="$t('Import')" value="url_list_import" icon=" "></v-stepper-item>
</template>
</v-stepper-header>
<v-stepper-window>
@@ -102,15 +108,27 @@
@click="importType = 'source'">
</v-card>
</v-col>
<v-col cols="12" md="6">
<v-card
:title="$t('UrlList')"
:subtitle="$t('UrlListSubtitle')"
prepend-icon="fa-solid fa-list"
variant="outlined"
:color="(importType == 'url-list') ? 'primary' : ''"
elevation="1"
@click="importType = 'url-list'">
</v-card>
</v-col>
</v-row>
<v-stepper-actions>
<template #prev>
<v-spacer></v-spacer>
</template>
<template #next>
<v-btn @click="stepper = 'url'" v-if="['url','ai', 'source'].includes(importType)">{{ $t('Next') }}</v-btn>
<v-btn @click="stepper = 'app'" v-if="importType == 'app'">{{ $t('Next') }}</v-btn>
<v-btn @click="stepper = 'bookmarklet'" v-if="importType == 'bookmarklet'">{{ $t('Next') }}</v-btn>
<v-btn @click="stepper = 'url'" v-if="['url','ai', 'source'].includes(importType)" color="success">{{ $t('Next') }}</v-btn>
<v-btn @click="stepper = 'app'" v-if="importType == 'app'" color="success">{{ $t('Next') }}</v-btn>
<v-btn @click="stepper = 'bookmarklet'" v-if="importType == 'bookmarklet'" color="success">{{ $t('Next') }}</v-btn>
<v-btn @click="stepper = 'url_list_input'" v-if="importType == 'url-list'" color="success">{{ $t('Next') }}</v-btn>
</template>
</v-stepper-actions>
</v-stepper-window-item>
@@ -289,7 +307,10 @@
<v-list>
<v-list-item prepend-icon="$edit" @click="editingIngredient = i; dialog=true">{{ $t('Edit') }}</v-list-item>
<v-list-item prepend-icon="$delete" @click="deleteIngredient(s,i)">{{ $t('Delete') }}</v-list-item>
<v-list-item prepend-icon="fa-solid fa-sort" @click="editingIngredientIndex = ingredientIndex; editingStepIndex = stepIndex; editingStep = s; dialogIngredientSorter = true">{{ $t('Move') }}</v-list-item>
<v-list-item prepend-icon="fa-solid fa-sort"
@click="editingIngredientIndex = ingredientIndex; editingStepIndex = stepIndex; editingStep = s; dialogIngredientSorter = true">
{{ $t('Move') }}
</v-list-item>
</v-list>
</v-menu>
</v-btn>
@@ -299,8 +320,9 @@
</v-list>
</v-col>
<v-col cols="12" md="6">
<v-textarea class="mt-2" v-model="s.instruction"></v-textarea>
<v-textarea class="mt-2" v-model="s.instruction" auto-grow></v-textarea>
</v-col>
<v-divider></v-divider>
</v-row>
<v-row>
<v-col class="text-center">
@@ -314,9 +336,9 @@
<v-text-field :label="$t('Original_Text')" v-model="editingIngredient.originalText" readonly></v-text-field>
<v-text-field :label="$t('Amount')" v-model="editingIngredient.amount"></v-text-field>
<v-text-field :label="$t('Unit')" v-model="editingIngredient.unit.name" v-if="editingIngredient.unit">
<v-text-field :label="$t('Unit')" v-model="editingIngredient.unit.name" :rules="[rules.required()]" v-if="editingIngredient.unit">
<template #append-inner>
<v-btn icon="$delete" color="delete" @click="editingIngredient.unit = null"></v-btn>
<v-btn icon="$delete" color="delete" @click="editingIngredient.unit = null"></v-btn>
</template>
</v-text-field>
<v-btn prepend-icon="$create" color="create" class="mb-4" @click="editingIngredient.unit = {name: ''}" v-else>{{ $t('Unit') }}</v-btn>
@@ -346,10 +368,11 @@
<v-img v-if="importResponse.recipe.imageUrl" :src="importResponse.recipe.imageUrl"></v-img>
</v-col>
<v-col cols="12" md="6">
<v-text-field :label="$t('Name')" v-model="importResponse.recipe.name"></v-text-field>
<v-text-field :label="$t('Name')" v-model="importResponse.recipe.name" :rules="[rules.maxLength(128)]"></v-text-field>
<v-number-input :label="$t('Servings')" v-model="importResponse.recipe.servings" :precision="2"></v-number-input>
<v-text-field :label="$t('ServingsText')" v-model="importResponse.recipe.servingsText"></v-text-field>
<v-textarea :label="$t('Description')" v-model="importResponse.recipe.description" clearable></v-textarea>
<v-textarea :label="$t('Description')" v-model="importResponse.recipe.description" :rules="[rules.maxLength(512)]" counter
clearable></v-textarea>
<v-checkbox v-model="editAfterImport" :label="$t('Edit_Recipe')" hide-details></v-checkbox>
</v-col>
@@ -452,23 +475,83 @@
</v-stepper-actions>
</v-stepper-window-item>
<!-- ---------------- -->
<!-- URL List -->
<!-- ---------------- -->
<v-stepper-window-item value="url_list_input">
<v-textarea :hint="$t('one_url_per_line')" auto-grow max-rows="20" persistent-hint v-model="urlListImportInput">
</v-textarea>
<v-stepper-actions>
<template #prev>
<v-btn @click="stepper = 'type'">{{ $t('Back') }}</v-btn>
</template>
<template #next>
<v-btn @click="stepper = 'url_list_import'; doListImport()" :disabled="urlListImportInput.length == 0">{{ $t('Import') }}</v-btn>
</template>
</v-stepper-actions>
</v-stepper-window-item>
<v-stepper-window-item value="url_list_import">
<v-progress-linear :height="16" :model-value="urlListImportedRecipes.length / urlListImportInput.split('\n').length * 100">
{{ urlListImportedRecipes.length }} / {{ urlListImportInput.split('\n').length }}
</v-progress-linear>
<v-list>
<v-list-item border v-for="r in urlListImportedRecipes" :title="r.name" :subtitle="r.sourceUrl" :key="r.id" :to="{name: 'RecipeViewPage', params: {id: r.id}}" target="_blank">
</v-list-item>
</v-list>
<v-stepper-actions>
<template #prev>
<v-btn @click="stepper = 'url_list_input'">{{ $t('Back') }}</v-btn>
</template>
<template #next>
<v-btn @click="resetImporter()" :disabled="loading">{{ $t('Reset') }}</v-btn>
</template>
</v-stepper-actions>
</v-stepper-window-item>
</v-stepper-window>
</template>
</v-stepper>
</v-col>
</v-row>
<v-row dense>
<v-col class="text-center">
<v-btn size="small" prepend-icon="fa-solid fa-arrow-rotate-left" variant="tonal" color="warning" @click="resetImporter()">{{ $t('Reset') }}</v-btn>
</v-col>
</v-row>
</v-container>
<step-ingredient-sorter-dialog :step-index="editingStepIndex" :step="editingStep" :recipe="importResponse.recipe" v-model="dialogIngredientSorter" :ingredient-index="editingIngredientIndex"></step-ingredient-sorter-dialog>
<step-ingredient-sorter-dialog :step-index="editingStepIndex" :step="editingStep" :recipe="importResponse.recipe" v-model="dialogIngredientSorter"
:ingredient-index="editingIngredientIndex"></step-ingredient-sorter-dialog>
</template>
<script lang="ts" setup>
import {useI18n} from "vue-i18n";
import {computed, onMounted, ref} from "vue";
import {AccessToken, ApiApi, ImportLog, type RecipeFromSource, RecipeFromSourceResponse, type SourceImportIngredient, SourceImportKeyword, SourceImportStep, Step} from "@/openapi";
import {ErrorMessageType, MessageType, useMessageStore} from "@/stores/MessageStore";
import {
AccessToken,
ApiApi,
ImportLog,
Recipe,
type RecipeFromSource,
RecipeFromSourceResponse,
type SourceImportIngredient,
SourceImportKeyword,
SourceImportStep,
Step
} from "@/openapi";
import {ErrorMessageType, MessageType, PreparedMessage, useMessageStore} from "@/stores/MessageStore";
import {useRouter} from "vue-router";
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore";
import {VueDraggable} from "vue-draggable-plus";
@@ -484,10 +567,55 @@ import {DateTime} from "luxon";
import {useDjangoUrls} from "@/composables/useDjangoUrls";
import bookmarkletJs from '@/assets/bookmarklet_v3?url'
import StepIngredientSorterDialog from "@/components/dialogs/StepIngredientSorterDialog.vue";
import {useRules} from "vuetify/labs/rules";
function doListImport() {
urlList.value = urlListImportInput.value.split('\n')
loading.value = true
importFromUrlList()
}
function importFromUrlList() {
let api = new ApiApi()
let url = urlList.value.pop()
if(url != undefined && url.trim() != ''){
api.apiRecipeFromSourceCreate({recipeFromSource: {url: url}}).then(sourceResponse => {
if(sourceResponse.recipe){
api.apiRecipeCreate({recipe: sourceResponse.recipe}).then(recipe => {
urlListImportedRecipes.value.push(recipe)
updateRecipeImage(recipe.id!, null, sourceResponse.recipe?.imageUrl).then(imageResponse => {
setTimeout(importFromUrlList, 500)
})
}).catch(err => {
}).finally(() => {
loading.value = false
})
}
}).catch(err => {
if (err.response.status == 429){
useMessageStore().addPreparedMessage(PreparedMessage.RATE_LIMIT, err)
} else {
useMessageStore().addMessage(MessageType.WARNING, t('ErrorUrlListImport'), 8000, url)
}
urlListImportInput.value = url + '\n' + urlList.value.join('\n')
stepper.value = 'url_list_input'
}).finally(() => {
})
} else {
useMessageStore().addPreparedMessage(PreparedMessage.CREATE_SUCCESS)
loading.value = false
}
}
const params = useUrlSearchParams('history', {})
const {mobile} = useDisplay()
const router = useRouter()
const rules = useRules()
const {t} = useI18n()
const {updateRecipeImage, doAiImport, doAppImport, fileApiLoading} = useFileApi()
const {getDjangoUrl} = useDjangoUrls()
@@ -503,7 +631,7 @@ const bookmarkletContent = computed(() => {
`})()`
})
const importType = ref<'url' | 'ai' | 'app' | 'bookmarklet' | 'source'>("url")
const importType = ref<'url' | 'ai' | 'app' | 'bookmarklet' | 'source' | 'url-list'>("url")
const importApp = ref('DEFAULT')
const stepper = ref("type")
const dialog = ref(false)
@@ -512,6 +640,10 @@ const loading = ref(false)
const importUrl = ref("")
const urlListImportInput = ref("")
const urlList = ref([] as string[])
const urlListImportedRecipes = ref([] as Recipe[])
const sourceImportText = ref("")
const appImportFiles = ref<File[]>([])
const appImportDuplicates = ref(false)
@@ -529,7 +661,7 @@ const editingIngredient = ref({} as SourceImportIngredient)
// stuff for ingredient mover, find some better solution at some point (finally merge importer/editor?)
const editingIngredientIndex = ref(0)
const dialogIngredientSorter = ref(false)
const editingStep = ref<Step| SourceImportStep>({} as Step)
const editingStep = ref<Step | SourceImportStep>({} as Step)
const editingStepIndex = ref(0)
onMounted(() => {
@@ -656,7 +788,7 @@ function createRecipeFromImport() {
api.apiRecipeCreate({recipe: importResponse.value.recipe}).then(recipe => {
updateRecipeImage(recipe.id!, null, importResponse.value.recipe?.imageUrl).then(r => {
if(editAfterImport.value){
if (editAfterImport.value) {
router.push({name: 'ModelEditPage', params: {id: recipe.id, model: 'recipe'}})
} else {
router.push({name: 'RecipeViewPage', params: {id: recipe.id}})
@@ -852,6 +984,13 @@ function loadOrCreateBookmarkletToken() {
})
}
/**
* reset the importer at any point
*/
function resetImporter() {
location.reload()
}
</script>
<style scoped>

View File

@@ -30,6 +30,7 @@ export enum PreparedMessage {
MERGE_SUCCESS = 'MERGE_SUCCESS',
MOVE_SUCCESS = 'MOVE_SUCCESS',
NOT_FOUND = 'NOT_FOUND',
RATE_LIMIT = 'RATE_LIMIT',
}
/**
@@ -155,6 +156,14 @@ export const useMessageStore = defineStore('message_store', () => {
if (preparedMessage == PreparedMessage.NOT_FOUND) {
addMessage(MessageType.WARNING, {title: t('NotFound'), text: t('NotFoundHelp')} as StructuredMessage, 6000, data)
}
if (preparedMessage == PreparedMessage.RATE_LIMIT) {
data.response.json().then(responseJson => {
addMessage(MessageType.WARNING, {title: t(''), text: t('RateLimitHelp') + '\n' + responseJson.detail} as StructuredMessage, 6000, data)
}).catch(() => {
addMessage(MessageType.WARNING, {title: t(''), text: t('RateLimitHelp')} as StructuredMessage, 6000, data)
})
}
}
/**