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

@@ -1,7 +1,7 @@
FROM python:3.13-alpine3.21 FROM python:3.13-alpine3.21
#Install all dependencies. #Install all dependencies.
RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev openldap git RUN apk add --no-cache postgresql-libs postgresql-client gettext zlib libjpeg libwebp libxml2-dev libxslt-dev openldap git libgcc libstdc++
#Print all logs without buffering it. #Print all logs without buffering it.
ENV PYTHONUNBUFFERED 1 ENV PYTHONUNBUFFERED 1
@@ -24,7 +24,7 @@ RUN \
# remove Development dependencies from requirements.txt # remove Development dependencies from requirements.txt
RUN sed -i '/# Development/,$d' requirements.txt RUN sed -i '/# Development/,$d' requirements.txt
RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev openssl-dev libffi-dev libgcc libstdc++ cargo openldap-dev python3-dev xmlsec-dev xmlsec build-base g++ curl && \ RUN apk add --no-cache --virtual .build-deps gcc musl-dev postgresql-dev zlib-dev jpeg-dev libwebp-dev openssl-dev libffi-dev cargo openldap-dev python3-dev xmlsec-dev xmlsec build-base g++ curl && \
echo -n "INPUT ( libldap.so )" > /usr/lib/libldap_r.so && \ echo -n "INPUT ( libldap.so )" > /usr/lib/libldap_r.so && \
python -m venv venv && \ python -m venv venv && \
/opt/recipes/venv/bin/python -m pip install --upgrade pip && \ /opt/recipes/venv/bin/python -m pip install --upgrade pip && \

View File

@@ -491,7 +491,11 @@ def get_images_from_soup(soup, url):
u = u.split('?')[0] u = u.split('?')[0]
filename = re.search(r'/([\w_-]+[.](jpg|jpeg|gif|png))$', u) filename = re.search(r'/([\w_-]+[.](jpg|jpeg|gif|png))$', u)
if filename: if filename:
if (('http' not in u) and (url)): if u.startswith('//'):
# urls from e.g. ottolenghi.co.uk start with //
u = 'https:' + u
if ('http' not in u) and url:
print(f'rewriting URL {u}')
# sometimes an image source can be relative # sometimes an image source can be relative
# if it is provide the base url # if it is provide the base url
u = '{}://{}{}'.format(prot, site, u) u = '{}://{}{}'.format(prot, site, u)

View File

@@ -300,6 +300,12 @@ PRIVACY_URL=
IMPRINT_URL= IMPRINT_URL=
``` ```
#### Rate Limits
There are some rate limits that can be configured.
- RATELIMIT_URL_IMPORT_REQUESTS: limit the number of external URL import requests. Useful to prevent your server from being abused for malicious requests.
### Authentication ### Authentication
All configurable variables regarding authentication. All configurable variables regarding authentication.

View File

@@ -141,7 +141,7 @@ AI_RATELIMIT = os.getenv('AI_RATELIMIT', '60/hour')
SHARING_ABUSE = extract_bool('SHARING_ABUSE', False) SHARING_ABUSE = extract_bool('SHARING_ABUSE', False)
SHARING_LIMIT = int(os.getenv('SHARING_LIMIT', 0)) SHARING_LIMIT = int(os.getenv('SHARING_LIMIT', 0))
DRF_THROTTLE_RECIPE_URL_IMPORT = os.getenv('DRF_THROTTLE_RECIPE_URL_IMPORT', '60/hour') DRF_THROTTLE_RECIPE_URL_IMPORT = os.getenv('DRF_THROTTLE_RECIPE_URL_IMPORT', os.getenv('RATELIMIT_URL_IMPORT_REQUESTS', '60/hour'))
TERMS_URL = os.getenv('TERMS_URL', '') TERMS_URL = os.getenv('TERMS_URL', '')
PRIVACY_URL = os.getenv('PRIVACY_URL', '') PRIVACY_URL = os.getenv('PRIVACY_URL', '')

View File

@@ -4,7 +4,7 @@
</v-app-bar> </v-app-bar>
<v-app-bar :color="useUserPreferenceStore().userSettings.navBgColor" flat density="comfortable" v-if="useUserPreferenceStore().isAuthenticated"> <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> <v-img src="../../assets/brand_logo.svg" width="140px" class="ms-2" v-if="useUserPreferenceStore().userSettings.navShowLogo"></v-img>
</router-link> </router-link>
<v-spacer></v-spacer> <v-spacer></v-spacer>
@@ -120,7 +120,7 @@
<v-list-item-subtitle>{{ useUserPreferenceStore().activeSpace.name }}</v-list-item-subtitle> <v-list-item-subtitle>{{ useUserPreferenceStore().activeSpace.name }}</v-list-item-subtitle>
</v-list-item> </v-list-item>
<v-divider></v-divider> <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="$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="$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> <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-navigation-drawer>
<v-bottom-navigation grow v-if="useUserPreferenceStore().isAuthenticated && !lgAndUp"> <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-icon icon="fa-fw fas fa-book "/>
</v-btn> </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="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="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="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-list>
</v-bottom-sheet> </v-bottom-sheet>
</v-btn> </v-btn>

View File

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

View File

@@ -165,7 +165,7 @@ const showDetailDialog = ref(false)
*/ */
function addTestMessage() { function addTestMessage() {
let types = [MessageType.SUCCESS, MessageType.ERROR, MessageType.INFO, MessageType.WARNING] 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> </script>

View File

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

View File

@@ -12,7 +12,7 @@
> >
<!-- <small>{{ DateTime.fromSeconds(visibleMessage.createdAt).toLocaleString(DateTime.DATETIME_MED) }}</small> <br/>--> <!-- <small>{{ DateTime.fromSeconds(visibleMessage.createdAt).toLocaleString(DateTime.DATETIME_MED) }}</small> <br/>-->
<h3 v-if="visibleMessage.msg.title">{{ visibleMessage.msg.title }}</h3> <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"> <template #actions v-if="showViewButton">

View File

@@ -37,7 +37,7 @@
<v-row> <v-row>
<v-col cols="12" md="6" v-if="showTime || step.time != 0"> <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>
<v-col cols="12" md="6" v-if="showRecipe || step.stepRecipe != null"> <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> <model-select model="Recipe" v-model="step.stepRecipe" :object="false" append-to-body></model-select>
@@ -51,9 +51,14 @@
<v-col cols="12"> <v-col cols="12">
<v-label>{{ $t('Ingredients') }}</v-label> <v-label>{{ $t('Ingredients') }}</v-label>
<div v-if="!mobile"> <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-row v-for="(ingredient, index) in step.ingredients" dense>
<v-col cols="2" v-if="!ingredient.isHeader"> <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" <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"> hide-details v-if="!ingredient.noAmount">
@@ -92,8 +97,8 @@
}} }}
</v-list-item> </v-list-item>
<v-list-item v-if="ingredient.originalText" prepend-icon="$import"> <v-list-item v-if="ingredient.originalText" prepend-icon="$import">
<v-list-item-title>{{$t('Original_Text')}}</v-list-item-title> <v-list-item-title>{{ $t('Original_Text') }}</v-list-item-title>
<v-list-item-subtitle>{{ ingredient.originalText}}</v-list-item-subtitle> <v-list-item-subtitle>{{ ingredient.originalText }}</v-list-item-subtitle>
</v-list-item> </v-list-item>
</v-list> </v-list>
</v-menu> </v-menu>
@@ -174,14 +179,16 @@
</v-card> </v-card>
</v-dialog> </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-bottom-sheet v-model="dialogIngredientEditor">
<v-card v-if="editingIngredientIndex >= 0"> <v-card v-if="editingIngredientIndex >= 0">
<v-closable-card-title :title="$t('Ingredient Editor')" v-model="dialogIngredientEditor"></v-closable-card-title> <v-closable-card-title :title="$t('Ingredient Editor')" v-model="dialogIngredientEditor"></v-closable-card-title>
<v-card-text> <v-card-text>
<v-form> <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')" <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> :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" <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-col>
</v-row> </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-form>
</v-tabs-window-item> </v-tabs-window-item>
@@ -95,7 +96,7 @@
</v-tabs-window-item> </v-tabs-window-item>
<v-tabs-window-item value="settings"> <v-tabs-window-item value="settings">
<v-form :disabled="loading || fileApiLoading"> <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-model="editingObj.showIngredientOverview"></v-checkbox>
<v-text-field :label="$t('Imported_From')" v-model="editingObj.sourceUrl"></v-text-field> <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) => { return modelClass.value.destroy(editingObj.value.id).then((r: any) => {
emit('delete', editingObj.value) emit('delete', editingObj.value)
console.log('deleted')
editingObj.value = {} as T editingObj.value = {} as T
}).catch((err: any) => { }).catch((err: any) => {
useMessageStore().addError(ErrorMessageType.DELETE_ERROR, err) useMessageStore().addError(ErrorMessageType.DELETE_ERROR, err)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -147,6 +147,7 @@
"Energy": "Energia", "Energy": "Energia",
"Entries": "", "Entries": "",
"Error": "Error", "Error": "Error",
"ErrorUrlListImport": "",
"Export": "Exportar", "Export": "Exportar",
"Export_As_ICal": "Exportar el periodo actual en formato iCal", "Export_As_ICal": "Exportar el periodo actual en formato iCal",
"Export_Not_Yet_Supported": "Exportación no soportada todavía", "Export_Not_Yet_Supported": "Exportación no soportada todavía",
@@ -260,6 +261,7 @@
"More": "", "More": "",
"Move": "Mover", "Move": "Mover",
"MoveCategory": "Mover a: ", "MoveCategory": "Mover a: ",
"MoveToStep": "",
"Move_Down": "mover abajo", "Move_Down": "mover abajo",
"Move_Food": "Mover ingediente", "Move_Food": "Mover ingediente",
"Move_Keyword": "Mover palabra clave", "Move_Keyword": "Mover palabra clave",
@@ -344,6 +346,8 @@
"QuickEntry": "Entrada Rápida", "QuickEntry": "Entrada Rápida",
"Random Recipes": "Recetas Aleatorias", "Random Recipes": "Recetas Aleatorias",
"RandomOrder": "", "RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Puntuación", "Rating": "Puntuación",
"Ratings": "Calificaciones", "Ratings": "Calificaciones",
"Recently_Viewed": "Visto recientemente", "Recently_Viewed": "Visto recientemente",
@@ -471,6 +475,8 @@
"Updated": "Actualizada", "Updated": "Actualizada",
"UpgradeNow": "", "UpgradeNow": "",
"UrlImportSubtitle": "", "UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importar desde url", "Url_Import": "Importar desde url",
"Use_Fractions": "Use fracciones", "Use_Fractions": "Use fracciones",
"Use_Fractions_Help": "Convertir automáticamente los decimales en fracciones al ver una receta.", "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", "Enable_Amount": "Ota Määrä käyttöön",
"Energy": "Energia", "Energy": "Energia",
"Entries": "", "Entries": "",
"ErrorUrlListImport": "",
"Export": "Vie", "Export": "Vie",
"Export_As_ICal": "Vie nykyinen jakso iCal muotoon", "Export_As_ICal": "Vie nykyinen jakso iCal muotoon",
"Export_To_ICal": "Vie .ics", "Export_To_ICal": "Vie .ics",
@@ -157,6 +158,7 @@
"Month": "Kuukausi", "Month": "Kuukausi",
"More": "", "More": "",
"Move": "Siirry", "Move": "Siirry",
"MoveToStep": "",
"Move_Down": "Siirry alas", "Move_Down": "Siirry alas",
"Move_Food": "Siirrä ruoka", "Move_Food": "Siirrä ruoka",
"Move_Keyword": "Siirrä Avainsana", "Move_Keyword": "Siirrä Avainsana",
@@ -208,6 +210,8 @@
"Property_Editor": "", "Property_Editor": "",
"Proteins": "Proteiinit", "Proteins": "Proteiinit",
"RandomOrder": "", "RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Luokitus", "Rating": "Luokitus",
"Recently_Viewed": "Äskettäin katsotut", "Recently_Viewed": "Äskettäin katsotut",
"Recipe": "Resepti", "Recipe": "Resepti",
@@ -297,6 +301,8 @@
"Update": "", "Update": "",
"UpgradeNow": "", "UpgradeNow": "",
"UrlImportSubtitle": "", "UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "URL Tuonti", "Url_Import": "URL Tuonti",
"Use_Plural_Food_Always": "", "Use_Plural_Food_Always": "",
"Use_Plural_Food_Simple": "", "Use_Plural_Food_Simple": "",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -131,6 +131,7 @@
"Enable_Amount": "Aktiver mengde", "Enable_Amount": "Aktiver mengde",
"Energy": "Energi", "Energy": "Energi",
"Entries": "", "Entries": "",
"ErrorUrlListImport": "",
"Export": "Eksporter", "Export": "Eksporter",
"Export_As_ICal": "Eksporter gjeldende periode som iCal format", "Export_As_ICal": "Eksporter gjeldende periode som iCal format",
"Export_Not_Yet_Supported": "", "Export_Not_Yet_Supported": "",
@@ -238,6 +239,7 @@
"More": "", "More": "",
"Move": "Flytt", "Move": "Flytt",
"MoveCategory": "Flytt til: ", "MoveCategory": "Flytt til: ",
"MoveToStep": "",
"Move_Down": "Flytt ned", "Move_Down": "Flytt ned",
"Move_Food": "Flytt Matrett", "Move_Food": "Flytt Matrett",
"Move_Keyword": "Flytt nøkkelord", "Move_Keyword": "Flytt nøkkelord",
@@ -316,6 +318,8 @@
"QuickEntry": "Hurtigregistrering", "QuickEntry": "Hurtigregistrering",
"Random Recipes": "Tilfeldige oppskrifter", "Random Recipes": "Tilfeldige oppskrifter",
"RandomOrder": "", "RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Vurdering", "Rating": "Vurdering",
"Ratings": "", "Ratings": "",
"Recently_Viewed": "Nylig vist", "Recently_Viewed": "Nylig vist",
@@ -431,6 +435,8 @@
"Update_Existing_Data": "Oppdater eksisterende data", "Update_Existing_Data": "Oppdater eksisterende data",
"UpgradeNow": "", "UpgradeNow": "",
"UrlImportSubtitle": "", "UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importer lenke", "Url_Import": "Importer lenke",
"Use_Fractions": "Bruk deler", "Use_Fractions": "Bruk deler",
"Use_Fractions_Help": "Automatisk konverter desimaler til deler når du ser på en oppskrift.", "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", "Enable_Amount": "Schakel hoeveelheid in",
"Energy": "Energie", "Energy": "Energie",
"Entries": "", "Entries": "",
"ErrorUrlListImport": "",
"Export": "Exporteren", "Export": "Exporteren",
"Export_As_ICal": "Exporteer huidige periode naar iCal formaat", "Export_As_ICal": "Exporteer huidige periode naar iCal formaat",
"Export_Not_Yet_Supported": "Export nog niet ondersteund", "Export_Not_Yet_Supported": "Export nog niet ondersteund",
@@ -242,6 +243,7 @@
"More": "", "More": "",
"Move": "Verplaats", "Move": "Verplaats",
"MoveCategory": "Verplaats naar: ", "MoveCategory": "Verplaats naar: ",
"MoveToStep": "",
"Move_Down": "Verplaats omlaag", "Move_Down": "Verplaats omlaag",
"Move_Food": "Verplaats Eten", "Move_Food": "Verplaats Eten",
"Move_Keyword": "Verplaats Etiket", "Move_Keyword": "Verplaats Etiket",
@@ -320,6 +322,8 @@
"QuickEntry": "Snelle invoer", "QuickEntry": "Snelle invoer",
"Random Recipes": "Willekeurige recepten", "Random Recipes": "Willekeurige recepten",
"RandomOrder": "", "RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Beoordeling", "Rating": "Beoordeling",
"Ratings": "Waardering", "Ratings": "Waardering",
"Recently_Viewed": "Recent bekeken", "Recently_Viewed": "Recent bekeken",
@@ -435,6 +439,8 @@
"Update_Existing_Data": "Bestaande gegevens bijwerken", "Update_Existing_Data": "Bestaande gegevens bijwerken",
"UpgradeNow": "", "UpgradeNow": "",
"UrlImportSubtitle": "", "UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importeer URL", "Url_Import": "Importeer URL",
"Use_Fractions": "Gebruik Kommagetallen", "Use_Fractions": "Gebruik Kommagetallen",
"Use_Fractions_Help": "Zet decimalen automatisch om naar breuken tijdens het bekijken van een recept.", "Use_Fractions_Help": "Zet decimalen automatisch om naar breuken tijdens het bekijken van een recept.",

View File

@@ -148,6 +148,7 @@
"Energy": "Energia", "Energy": "Energia",
"Entries": "", "Entries": "",
"Error": "Błąd", "Error": "Błąd",
"ErrorUrlListImport": "",
"Export": "Eksport", "Export": "Eksport",
"Export_As_ICal": "Eksportuj bieżący okres do formatu iCal", "Export_As_ICal": "Eksportuj bieżący okres do formatu iCal",
"Export_Not_Yet_Supported": "Eksportowanie jeszcze nie wspierane", "Export_Not_Yet_Supported": "Eksportowanie jeszcze nie wspierane",
@@ -261,6 +262,7 @@
"More": "", "More": "",
"Move": "Przenieś", "Move": "Przenieś",
"MoveCategory": "Przenieś do: ", "MoveCategory": "Przenieś do: ",
"MoveToStep": "",
"Move_Down": "Przesunąć w dół", "Move_Down": "Przesunąć w dół",
"Move_Food": "Przenieś żywność", "Move_Food": "Przenieś żywność",
"Move_Keyword": "Przenieś słowo kluczowe", "Move_Keyword": "Przenieś słowo kluczowe",
@@ -346,6 +348,8 @@
"QuickEntry": "Szybki wpis", "QuickEntry": "Szybki wpis",
"Random Recipes": "Losowe przepisy", "Random Recipes": "Losowe przepisy",
"RandomOrder": "", "RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Ocena", "Rating": "Ocena",
"Ratings": "Oceny", "Ratings": "Oceny",
"Recently_Viewed": "Ostatnio oglądane", "Recently_Viewed": "Ostatnio oglądane",
@@ -473,6 +477,8 @@
"Updated": "Zaktualizowano", "Updated": "Zaktualizowano",
"UpgradeNow": "", "UpgradeNow": "",
"UrlImportSubtitle": "", "UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importowanie URL", "Url_Import": "Importowanie URL",
"Use_Fractions": "Użyj ułamków", "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.", "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", "Enable_Amount": "Ativar quantidade",
"Energy": "Energia", "Energy": "Energia",
"Entries": "", "Entries": "",
"ErrorUrlListImport": "",
"Export": "Exportar", "Export": "Exportar",
"Export_As_ICal": "Exportar período atual para o formato ICal", "Export_As_ICal": "Exportar período atual para o formato ICal",
"Export_To_ICal": "Exportar .ics", "Export_To_ICal": "Exportar .ics",
@@ -200,6 +201,7 @@
"More": "", "More": "",
"Move": "Mover", "Move": "Mover",
"MoveCategory": "Mover para: ", "MoveCategory": "Mover para: ",
"MoveToStep": "",
"Move_Down": "Mover para baixo", "Move_Down": "Mover para baixo",
"Move_Food": "Mover comida", "Move_Food": "Mover comida",
"Move_Keyword": "Mover palavra-chave", "Move_Keyword": "Mover palavra-chave",
@@ -267,6 +269,8 @@
"QuickEntry": "", "QuickEntry": "",
"Random Recipes": "Receitas Aleatórias", "Random Recipes": "Receitas Aleatórias",
"RandomOrder": "", "RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Avaliação", "Rating": "Avaliação",
"Ratings": "Avaliações", "Ratings": "Avaliações",
"Recently_Viewed": "Vistos Recentemente", "Recently_Viewed": "Vistos Recentemente",
@@ -370,6 +374,8 @@
"Update": "", "Update": "",
"UpgradeNow": "", "UpgradeNow": "",
"UrlImportSubtitle": "", "UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importação de URL", "Url_Import": "Importação de URL",
"Use_Fractions": "Usar frações", "Use_Fractions": "Usar frações",
"Use_Fractions_Help": "Converter automaticamente casas decimais para frações enquanto se visualiza uma receita.", "Use_Fractions_Help": "Converter automaticamente casas decimais para frações enquanto se visualiza uma receita.",

View File

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

View File

@@ -129,6 +129,7 @@
"Enable_Amount": "Activare cantitate", "Enable_Amount": "Activare cantitate",
"Energy": "Energie", "Energy": "Energie",
"Entries": "", "Entries": "",
"ErrorUrlListImport": "",
"Export": "Exportă", "Export": "Exportă",
"Export_As_ICal": "Exportul perioadei curente în format iCal", "Export_As_ICal": "Exportul perioadei curente în format iCal",
"Export_Not_Yet_Supported": "Exportul încă nu este compatibil", "Export_Not_Yet_Supported": "Exportul încă nu este compatibil",
@@ -235,6 +236,7 @@
"More": "", "More": "",
"Move": "Mută", "Move": "Mută",
"MoveCategory": "Mută la: ", "MoveCategory": "Mută la: ",
"MoveToStep": "",
"Move_Down": "Deplasați-vă în jos", "Move_Down": "Deplasați-vă în jos",
"Move_Food": "Mutare mâncare", "Move_Food": "Mutare mâncare",
"Move_Keyword": "Mută cuvânt cheie", "Move_Keyword": "Mută cuvânt cheie",
@@ -309,6 +311,8 @@
"QuickEntry": "Înscriere rapidă", "QuickEntry": "Înscriere rapidă",
"Random Recipes": "Rețete aleatoare", "Random Recipes": "Rețete aleatoare",
"RandomOrder": "", "RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Evaluare", "Rating": "Evaluare",
"Ratings": "Evaluări", "Ratings": "Evaluări",
"Recently_Viewed": "Vizualizate recent", "Recently_Viewed": "Vizualizate recent",
@@ -423,6 +427,8 @@
"Update": "", "Update": "",
"UpgradeNow": "", "UpgradeNow": "",
"UrlImportSubtitle": "", "UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Importă URL", "Url_Import": "Importă URL",
"Use_Fractions": "Folosire fracțiuni", "Use_Fractions": "Folosire fracțiuni",
"Use_Fractions_Help": "Convertiți automat zecimalele în fracții atunci când vizualizați o rețetă.", "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": "Активировать Количество", "Enable_Amount": "Активировать Количество",
"Energy": "Энергетическая ценность", "Energy": "Энергетическая ценность",
"Entries": "", "Entries": "",
"ErrorUrlListImport": "",
"Export": "Экспорт", "Export": "Экспорт",
"Export_As_ICal": "Экспорт текущего периода в iCal формат", "Export_As_ICal": "Экспорт текущего периода в iCal формат",
"Export_To_ICal": "Экспортировать .ics", "Export_To_ICal": "Экспортировать .ics",
@@ -189,6 +190,7 @@
"More": "", "More": "",
"Move": "Переместить", "Move": "Переместить",
"MoveCategory": "Переместить в: ", "MoveCategory": "Переместить в: ",
"MoveToStep": "",
"Move_Down": "Перенести вниз", "Move_Down": "Перенести вниз",
"Move_Food": "Переместить еду", "Move_Food": "Переместить еду",
"Move_Keyword": "Перенести ключевое слово", "Move_Keyword": "Перенести ключевое слово",
@@ -252,6 +254,8 @@
"Quick actions": "Быстрые действия", "Quick actions": "Быстрые действия",
"Random Recipes": "Случайные рецепты", "Random Recipes": "Случайные рецепты",
"RandomOrder": "", "RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Рейтинг", "Rating": "Рейтинг",
"Ratings": "Рейтинги", "Ratings": "Рейтинги",
"Recently_Viewed": "Недавно просмотренные", "Recently_Viewed": "Недавно просмотренные",
@@ -351,6 +355,8 @@
"Update": "", "Update": "",
"UpgradeNow": "", "UpgradeNow": "",
"UrlImportSubtitle": "", "UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Импорт гиперссылки", "Url_Import": "Импорт гиперссылки",
"User": "Пользователь", "User": "Пользователь",
"View": "Просмотр", "View": "Просмотр",

View File

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

View File

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

View File

@@ -147,6 +147,7 @@
"Energy": "Enerji", "Energy": "Enerji",
"Entries": "", "Entries": "",
"Error": "Hata", "Error": "Hata",
"ErrorUrlListImport": "",
"Export": "Dışa Aktar", "Export": "Dışa Aktar",
"Export_As_ICal": "Mevcut dönemi iCal formatında 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", "Export_Not_Yet_Supported": "Dışa aktarma henüz desteklenmiyor",
@@ -260,6 +261,7 @@
"More": "", "More": "",
"Move": "Taşı", "Move": "Taşı",
"MoveCategory": "Taşı: ", "MoveCategory": "Taşı: ",
"MoveToStep": "",
"Move_Down": "Aşağıya Taşı", "Move_Down": "Aşağıya Taşı",
"Move_Food": "Yiyeceği Taşı", "Move_Food": "Yiyeceği Taşı",
"Move_Keyword": "Anahtar Kelimeyi Taşı", "Move_Keyword": "Anahtar Kelimeyi Taşı",
@@ -345,6 +347,8 @@
"QuickEntry": "Hızlı Giriş", "QuickEntry": "Hızlı Giriş",
"Random Recipes": "Rasgele Tarifler", "Random Recipes": "Rasgele Tarifler",
"RandomOrder": "", "RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Puanlama", "Rating": "Puanlama",
"Ratings": "Derecelendirmeler", "Ratings": "Derecelendirmeler",
"Recently_Viewed": "Son Görüntülenen", "Recently_Viewed": "Son Görüntülenen",
@@ -472,6 +476,8 @@
"Updated": "Güncellendi", "Updated": "Güncellendi",
"UpgradeNow": "", "UpgradeNow": "",
"UrlImportSubtitle": "", "UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Url İçeri Aktar", "Url_Import": "Url İçeri Aktar",
"Use_Fractions": "Kesirleri Kullan", "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.", "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": "Включити Кількість", "Enable_Amount": "Включити Кількість",
"Energy": "Енергія", "Energy": "Енергія",
"Entries": "", "Entries": "",
"ErrorUrlListImport": "",
"Export": "Експорт", "Export": "Експорт",
"Export_As_ICal": "Експортувати теперішній період до формату iCal", "Export_As_ICal": "Експортувати теперішній період до формату iCal",
"Export_Not_Yet_Supported": "", "Export_Not_Yet_Supported": "",
@@ -214,6 +215,7 @@
"More": "", "More": "",
"Move": "Перемістити", "Move": "Перемістити",
"MoveCategory": "Перемістити До: ", "MoveCategory": "Перемістити До: ",
"MoveToStep": "",
"Move_Down": "Перемістити вниз", "Move_Down": "Перемістити вниз",
"Move_Food": "Перемістити Їжу", "Move_Food": "Перемістити Їжу",
"Move_Keyword": "Перемістити Ключове слово", "Move_Keyword": "Перемістити Ключове слово",
@@ -285,6 +287,8 @@
"QuickEntry": "", "QuickEntry": "",
"Random Recipes": "", "Random Recipes": "",
"RandomOrder": "", "RandomOrder": "",
"RateLimit": "",
"RateLimitHelp": "",
"Rating": "Рейтинг", "Rating": "Рейтинг",
"Ratings": "", "Ratings": "",
"Recently_Viewed": "Нещодавно переглянуті", "Recently_Viewed": "Нещодавно переглянуті",
@@ -392,6 +396,8 @@
"Update": "", "Update": "",
"UpgradeNow": "", "UpgradeNow": "",
"UrlImportSubtitle": "", "UrlImportSubtitle": "",
"UrlList": "",
"UrlListSubtitle": "",
"Url_Import": "Імпорт за посиланням", "Url_Import": "Імпорт за посиланням",
"Use_Fractions": "Використовувати дроби", "Use_Fractions": "Використовувати дроби",
"Use_Fractions_Help": "Автоматично конвертувати десятки в дроби, коли дивитесь рецепт.", "Use_Fractions_Help": "Автоматично конвертувати десятки в дроби, коли дивитесь рецепт.",

View File

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

View File

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

View File

@@ -12,7 +12,7 @@
</v-row> </v-row>
<v-row> <v-row>
<v-col> <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-col>
</v-row> </v-row>
</v-container> </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> </script>
<style scoped> <style scoped>

View File

@@ -73,7 +73,7 @@
@click="fdcSelectedIngredient = ingredient; fdcDialog = true"></v-btn> @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-btn @click="updateFoodFdcData(ingredient)" icon="fa-solid fa-arrows-rotate" size="small" density="compact" variant="plain"
v-if="ingredient.food.fdcId"></v-btn> 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" icon="fa-solid fa-arrow-up-right-from-square"
size="small" variant="plain" v-if="ingredient.food.fdcId"></v-btn> size="small" variant="plain" v-if="ingredient.food.fdcId"></v-btn>
</template> </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> </script>
<style scoped> <style scoped>

View File

@@ -37,6 +37,12 @@
<v-stepper-item :title="$t('Bookmarklet')" value="bookmarklet" icon=" "></v-stepper-item> <v-stepper-item :title="$t('Bookmarklet')" value="bookmarklet" icon=" "></v-stepper-item>
</template> </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-header>
<v-stepper-window> <v-stepper-window>
@@ -102,15 +108,27 @@
@click="importType = 'source'"> @click="importType = 'source'">
</v-card> </v-card>
</v-col> </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-row>
<v-stepper-actions> <v-stepper-actions>
<template #prev> <template #prev>
<v-spacer></v-spacer> <v-spacer></v-spacer>
</template> </template>
<template #next> <template #next>
<v-btn @click="stepper = 'url'" v-if="['url','ai', 'source'].includes(importType)">{{ $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'">{{ $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'">{{ $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> </template>
</v-stepper-actions> </v-stepper-actions>
</v-stepper-window-item> </v-stepper-window-item>
@@ -289,7 +307,10 @@
<v-list> <v-list>
<v-list-item prepend-icon="$edit" @click="editingIngredient = i; dialog=true">{{ $t('Edit') }}</v-list-item> <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="$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-list>
</v-menu> </v-menu>
</v-btn> </v-btn>
@@ -299,8 +320,9 @@
</v-list> </v-list>
</v-col> </v-col>
<v-col cols="12" md="6"> <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-col>
<v-divider></v-divider>
</v-row> </v-row>
<v-row> <v-row>
<v-col class="text-center"> <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('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('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> <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> </template>
</v-text-field> </v-text-field>
<v-btn prepend-icon="$create" color="create" class="mb-4" @click="editingIngredient.unit = {name: ''}" v-else>{{ $t('Unit') }}</v-btn> <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-img v-if="importResponse.recipe.imageUrl" :src="importResponse.recipe.imageUrl"></v-img>
</v-col> </v-col>
<v-col cols="12" md="6"> <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-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-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-checkbox v-model="editAfterImport" :label="$t('Edit_Recipe')" hide-details></v-checkbox>
</v-col> </v-col>
@@ -452,23 +475,83 @@
</v-stepper-actions> </v-stepper-actions>
</v-stepper-window-item> </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> </v-stepper-window>
</template> </template>
</v-stepper> </v-stepper>
</v-col> </v-col>
</v-row> </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> </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> </template>
<script lang="ts" setup> <script lang="ts" setup>
import {useI18n} from "vue-i18n";
import {computed, onMounted, ref} from "vue"; import {computed, onMounted, ref} from "vue";
import {AccessToken, ApiApi, ImportLog, type RecipeFromSource, RecipeFromSourceResponse, type SourceImportIngredient, SourceImportKeyword, SourceImportStep, Step} from "@/openapi"; import {
import {ErrorMessageType, MessageType, useMessageStore} from "@/stores/MessageStore"; 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 {useRouter} from "vue-router";
import {useUserPreferenceStore} from "@/stores/UserPreferenceStore"; import {useUserPreferenceStore} from "@/stores/UserPreferenceStore";
import {VueDraggable} from "vue-draggable-plus"; import {VueDraggable} from "vue-draggable-plus";
@@ -484,10 +567,55 @@ import {DateTime} from "luxon";
import {useDjangoUrls} from "@/composables/useDjangoUrls"; import {useDjangoUrls} from "@/composables/useDjangoUrls";
import bookmarkletJs from '@/assets/bookmarklet_v3?url' import bookmarkletJs from '@/assets/bookmarklet_v3?url'
import StepIngredientSorterDialog from "@/components/dialogs/StepIngredientSorterDialog.vue"; 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 params = useUrlSearchParams('history', {})
const {mobile} = useDisplay() const {mobile} = useDisplay()
const router = useRouter() const router = useRouter()
const rules = useRules()
const {t} = useI18n()
const {updateRecipeImage, doAiImport, doAppImport, fileApiLoading} = useFileApi() const {updateRecipeImage, doAiImport, doAppImport, fileApiLoading} = useFileApi()
const {getDjangoUrl} = useDjangoUrls() 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 importApp = ref('DEFAULT')
const stepper = ref("type") const stepper = ref("type")
const dialog = ref(false) const dialog = ref(false)
@@ -512,6 +640,10 @@ const loading = ref(false)
const importUrl = ref("") const importUrl = ref("")
const urlListImportInput = ref("")
const urlList = ref([] as string[])
const urlListImportedRecipes = ref([] as Recipe[])
const sourceImportText = ref("") const sourceImportText = ref("")
const appImportFiles = ref<File[]>([]) const appImportFiles = ref<File[]>([])
const appImportDuplicates = ref(false) 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?) // stuff for ingredient mover, find some better solution at some point (finally merge importer/editor?)
const editingIngredientIndex = ref(0) const editingIngredientIndex = ref(0)
const dialogIngredientSorter = ref(false) const dialogIngredientSorter = ref(false)
const editingStep = ref<Step| SourceImportStep>({} as Step) const editingStep = ref<Step | SourceImportStep>({} as Step)
const editingStepIndex = ref(0) const editingStepIndex = ref(0)
onMounted(() => { onMounted(() => {
@@ -656,7 +788,7 @@ function createRecipeFromImport() {
api.apiRecipeCreate({recipe: importResponse.value.recipe}).then(recipe => { api.apiRecipeCreate({recipe: importResponse.value.recipe}).then(recipe => {
updateRecipeImage(recipe.id!, null, importResponse.value.recipe?.imageUrl).then(r => { 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'}}) router.push({name: 'ModelEditPage', params: {id: recipe.id, model: 'recipe'}})
} else { } else {
router.push({name: 'RecipeViewPage', params: {id: recipe.id}}) 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> </script>
<style scoped> <style scoped>

View File

@@ -30,6 +30,7 @@ export enum PreparedMessage {
MERGE_SUCCESS = 'MERGE_SUCCESS', MERGE_SUCCESS = 'MERGE_SUCCESS',
MOVE_SUCCESS = 'MOVE_SUCCESS', MOVE_SUCCESS = 'MOVE_SUCCESS',
NOT_FOUND = 'NOT_FOUND', NOT_FOUND = 'NOT_FOUND',
RATE_LIMIT = 'RATE_LIMIT',
} }
/** /**
@@ -155,6 +156,14 @@ export const useMessageStore = defineStore('message_store', () => {
if (preparedMessage == PreparedMessage.NOT_FOUND) { if (preparedMessage == PreparedMessage.NOT_FOUND) {
addMessage(MessageType.WARNING, {title: t('NotFound'), text: t('NotFoundHelp')} as StructuredMessage, 6000, data) 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)
})
}
} }
/** /**