Merge branch 'develop' into feature/importer_to_vue

# Conflicts:
#	vue/package.json
This commit is contained in:
vabene1111
2022-04-04 19:16:20 +02:00
19 changed files with 4925 additions and 2098 deletions

View File

@@ -34,7 +34,7 @@ if [ "${DB_ENGINE}" != 'django.db.backends.sqlite3' ]; then
display_warning "The environment variable 'POSTGRES_PASSWORD' is not set but REQUIRED for running Tandoor!" display_warning "The environment variable 'POSTGRES_PASSWORD' is not set but REQUIRED for running Tandoor!"
fi fi
while pg_isready --host=${POSTGRES_HOST} --port=${POSTGRES_PORT} -q; status=$?; attempt=$((attempt+1)); [ $status -ne 0 ] && [ $attempt -le $max_attempts ]; do while pg_isready --host=${POSTGRES_HOST} --port=${POSTGRES_PORT} --user=${POSTGRES_USER} -q; status=$?; attempt=$((attempt+1)); [ $status -ne 0 ] && [ $attempt -le $max_attempts ]; do
sleep 5 sleep 5
done done
fi fi

View File

@@ -237,7 +237,7 @@ admin.site.register(Ingredient, IngredientAdmin)
class CommentAdmin(admin.ModelAdmin): class CommentAdmin(admin.ModelAdmin):
list_display = ('recipe', 'name', 'created_at') list_display = ('recipe', 'name', 'created_at')
search_fields = ('text', 'user__username') search_fields = ('text', 'created_by__username')
date_hierarchy = 'created_at' date_hierarchy = 'created_at'
@staticmethod @staticmethod

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-04 12:31+0100\n" "POT-Creation-Date: 2021-11-04 12:31+0100\n"
"PO-Revision-Date: 2021-11-06 14:06+0000\n" "PO-Revision-Date: 2022-03-18 16:31+0000\n"
"Last-Translator: Nicklas Yli-Länttä <admin@timanttikuutio.eu>\n" "Last-Translator: Stefan Werner <werner@iki.fi>\n"
"Language-Team: Finnish <http://translate.tandoor.dev/projects/tandoor/" "Language-Team: Finnish <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/fi/>\n" "recipes-backend/fi/>\n"
"Language: fi\n" "Language: fi\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.8\n" "X-Generator: Weblate 4.10.1\n"
#: .\cookbook\filters.py:23 .\cookbook\templates\base.html:125 #: .\cookbook\filters.py:23 .\cookbook\templates\base.html:125
#: .\cookbook\templates\forms\ingredients.html:34 #: .\cookbook\templates\forms\ingredients.html:34
@@ -31,10 +31,12 @@ msgid ""
"Color of the top navigation bar. Not all colors work with all themes, just " "Color of the top navigation bar. Not all colors work with all themes, just "
"try them out!" "try them out!"
msgstr "" msgstr ""
"Ylänavigointipalkin väri. Ei kaikki värit toimi kaikkien teemojen kanssa; "
"kokeile!"
#: .\cookbook\forms.py:55 #: .\cookbook\forms.py:55
msgid "Default Unit to be used when inserting a new ingredient into a recipe." msgid "Default Unit to be used when inserting a new ingredient into a recipe."
msgstr "" msgstr "Oletusmittayksikkö uuden aineksen lisäämisessä."
#: .\cookbook\forms.py:57 #: .\cookbook\forms.py:57
msgid "" msgid ""

File diff suppressed because it is too large Load Diff

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-11 15:09+0200\n" "POT-Creation-Date: 2021-04-11 15:09+0200\n"
"PO-Revision-Date: 2021-04-12 20:22+0000\n" "PO-Revision-Date: 2022-03-29 20:36+0000\n"
"Last-Translator: Olle Mineur <olle.mineur@gmail.com>\n" "Last-Translator: Marcus Alsterfjord <marcus@marcussite.se>\n"
"Language-Team: Swedish <http://translate.tandoor.dev/projects/tandoor/" "Language-Team: Swedish <http://translate.tandoor.dev/projects/tandoor/"
"recipes-backend/sv/>\n" "recipes-backend/sv/>\n"
"Language: sv\n" "Language: sv\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.5.3\n" "X-Generator: Weblate 4.10.1\n"
#: .\cookbook\filters.py:23 .\cookbook\templates\base.html:91 #: .\cookbook\filters.py:23 .\cookbook\templates\base.html:91
#: .\cookbook\templates\forms\edit_internal_recipe.html:219 #: .\cookbook\templates\forms\edit_internal_recipe.html:219
@@ -192,13 +192,12 @@ msgstr "Du kan ange förvalda användare att dela recept med i inställningar."
#: .\cookbook\forms.py:368 #: .\cookbook\forms.py:368
#: .\cookbook\templates\forms\edit_internal_recipe.html:377 #: .\cookbook\templates\forms\edit_internal_recipe.html:377
#, fuzzy
msgid "" msgid ""
"You can use markdown to format this field. See the <a href=\"/docs/markdown/" "You can use markdown to format this field. See the <a href=\"/docs/markdown/"
"\">docs here</a>" "\">docs here</a>"
msgstr "" msgstr ""
"Du kan använda markdown för att formatera detta fält. Se <a href=\"/docs/" "Du kan använda markdown för att formatera detta fält. Se <a href=\"/docs/"
"markdown/\">dokumentation här</a> för mer information" "markdown/\">dokumentation här</a> för mer information."
#: .\cookbook\forms.py:393 #: .\cookbook\forms.py:393
msgid "A username is not required, if left blank the new user can choose one." msgid "A username is not required, if left blank the new user can choose one."
@@ -247,7 +246,7 @@ msgstr "Importerade ifrån"
#: .\cookbook\helper\template_helper.py:60 #: .\cookbook\helper\template_helper.py:60
#: .\cookbook\helper\template_helper.py:62 #: .\cookbook\helper\template_helper.py:62
msgid "Could not parse template code." msgid "Could not parse template code."
msgstr "" msgstr "Det gick inte att läsa mallkoden."
#: .\cookbook\integration\integration.py:102 #: .\cookbook\integration\integration.py:102
#: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20 #: .\cookbook\templates\import.html:14 .\cookbook\templates\import.html:20
@@ -565,10 +564,12 @@ msgid ""
"On this Page you can manage all storage folder locations that should be " "On this Page you can manage all storage folder locations that should be "
"monitored and synced." "monitored and synced."
msgstr "" msgstr ""
"På den här sidan kan du hantera alla lagringsmappar som ska övervakas och "
"synkroniseras."
#: .\cookbook\templates\batch\monitor.html:16 #: .\cookbook\templates\batch\monitor.html:16
msgid "The path must be in the following format" msgid "The path must be in the following format"
msgstr "" msgstr "Sökvägen måste ha följande format"
#: .\cookbook\templates\batch\monitor.html:27 #: .\cookbook\templates\batch\monitor.html:27
msgid "Sync Now!" msgid "Sync Now!"
@@ -819,7 +820,6 @@ msgid "Delete Recipe"
msgstr "Ta bort recept" msgstr "Ta bort recept"
#: .\cookbook\templates\forms\edit_internal_recipe.html:441 #: .\cookbook\templates\forms\edit_internal_recipe.html:441
#, fuzzy
msgid "Steps" msgid "Steps"
msgstr "Steg" msgstr "Steg"
@@ -999,7 +999,7 @@ msgstr "Recept"
#: .\cookbook\templates\index.html:94 #: .\cookbook\templates\index.html:94
msgid "Log in to view recipes" msgid "Log in to view recipes"
msgstr "" msgstr "Logga in för att se recept"
#: .\cookbook\templates\markdown_info.html:5 #: .\cookbook\templates\markdown_info.html:5
#: .\cookbook\templates\markdown_info.html:13 #: .\cookbook\templates\markdown_info.html:13
@@ -1024,11 +1024,11 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:25 #: .\cookbook\templates\markdown_info.html:25
msgid "Headers" msgid "Headers"
msgstr "" msgstr "Rubriker"
#: .\cookbook\templates\markdown_info.html:54 #: .\cookbook\templates\markdown_info.html:54
msgid "Formatting" msgid "Formatting"
msgstr "" msgstr "Formatering"
#: .\cookbook\templates\markdown_info.html:56 #: .\cookbook\templates\markdown_info.html:56
#: .\cookbook\templates\markdown_info.html:72 #: .\cookbook\templates\markdown_info.html:72
@@ -1043,21 +1043,21 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:59 #: .\cookbook\templates\markdown_info.html:59
#: .\cookbook\templates\markdown_info.html:74 #: .\cookbook\templates\markdown_info.html:74
msgid "This text is bold" msgid "This text is bold"
msgstr "" msgstr "Denna text är fetstil"
#: .\cookbook\templates\markdown_info.html:60 #: .\cookbook\templates\markdown_info.html:60
#: .\cookbook\templates\markdown_info.html:75 #: .\cookbook\templates\markdown_info.html:75
msgid "This text is italic" msgid "This text is italic"
msgstr "" msgstr "Denna text är kursiv"
#: .\cookbook\templates\markdown_info.html:61 #: .\cookbook\templates\markdown_info.html:61
#: .\cookbook\templates\markdown_info.html:77 #: .\cookbook\templates\markdown_info.html:77
msgid "Blockquotes are also possible" msgid "Blockquotes are also possible"
msgstr "" msgstr "Blockcitat är också möjligt"
#: .\cookbook\templates\markdown_info.html:84 #: .\cookbook\templates\markdown_info.html:84
msgid "Lists" msgid "Lists"
msgstr "" msgstr "Listor"
#: .\cookbook\templates\markdown_info.html:85 #: .\cookbook\templates\markdown_info.html:85
msgid "" msgid ""
@@ -1110,7 +1110,7 @@ msgstr ""
#: .\cookbook\templates\markdown_info.html:152 #: .\cookbook\templates\markdown_info.html:152
msgid "Tables" msgid "Tables"
msgstr "" msgstr "Tabeller"
#: .\cookbook\templates\markdown_info.html:153 #: .\cookbook\templates\markdown_info.html:153
msgid "" msgid ""

View File

@@ -10,6 +10,7 @@ from drf_writable_nested import UniqueFieldsMixin, WritableNestedModelSerializer
from rest_framework import serializers from rest_framework import serializers
from rest_framework.exceptions import NotFound, ValidationError from rest_framework.exceptions import NotFound, ValidationError
from cookbook.helper.CustomStorageClass import CachedS3Boto3Storage
from cookbook.helper.HelperFunctions import str2bool from cookbook.helper.HelperFunctions import str2bool
from cookbook.helper.shopping_helper import RecipeShoppingEditor from cookbook.helper.shopping_helper import RecipeShoppingEditor
from cookbook.models import (Automation, BookmarkletImport, Comment, CookLog, CustomFilter, from cookbook.models import (Automation, BookmarkletImport, Comment, CookLog, CustomFilter,
@@ -20,7 +21,7 @@ from cookbook.models import (Automation, BookmarkletImport, Comment, CookLog, Cu
SupermarketCategory, SupermarketCategoryRelation, Sync, SyncLog, Unit, SupermarketCategory, SupermarketCategoryRelation, Sync, SyncLog, Unit,
UserFile, UserPreference, ViewLog) UserFile, UserPreference, ViewLog)
from cookbook.templatetags.custom_tags import markdown from cookbook.templatetags.custom_tags import markdown
from recipes.settings import MEDIA_URL from recipes.settings import MEDIA_URL, AWS_ENABLED
class ExtendedRecipeMixin(serializers.ModelSerializer): class ExtendedRecipeMixin(serializers.ModelSerializer):
@@ -54,7 +55,12 @@ class ExtendedRecipeMixin(serializers.ModelSerializer):
def get_image(self, obj): def get_image(self, obj):
if obj.recipe_image: if obj.recipe_image:
return MEDIA_URL + obj.recipe_image if AWS_ENABLED:
storage = CachedS3Boto3Storage()
path = storage.url(obj.recipe_image)
else:
path = MEDIA_URL + obj.recipe_image
return path
class CustomDecimalField(serializers.Field): class CustomDecimalField(serializers.Field):
@@ -364,16 +370,23 @@ class SupermarketSerializer(UniqueFieldsMixin, SpacedModelSerializer):
fields = ('id', 'name', 'description', 'category_to_supermarket') fields = ('id', 'name', 'description', 'category_to_supermarket')
class RecipeSimpleSerializer(serializers.ModelSerializer): class RecipeSimpleSerializer(WritableNestedModelSerializer):
url = serializers.SerializerMethodField('get_url') url = serializers.SerializerMethodField('get_url')
def get_url(self, obj): def get_url(self, obj):
return reverse('view_recipe', args=[obj.id]) return reverse('view_recipe', args=[obj.id])
def create(self, validated_data):
# don't allow writing to Recipe via this API
return Recipe.objects.get(**validated_data)
def update(self, instance, validated_data):
# don't allow writing to Recipe via this API
return Recipe.objects.get(**validated_data)
class Meta: class Meta:
model = Recipe model = Recipe
fields = ('id', 'name', 'url') fields = ('id', 'name', 'url')
read_only_fields = ['id', 'name', 'url']
class FoodSimpleSerializer(serializers.ModelSerializer): class FoodSimpleSerializer(serializers.ModelSerializer):
@@ -427,6 +440,8 @@ class FoodSerializer(UniqueFieldsMixin, WritableNestedModelSerializer, ExtendedR
name=sc_name, name=sc_name,
space=space, defaults=sm_category) space=space, defaults=sm_category)
onhand = validated_data.pop('food_onhand', None) onhand = validated_data.pop('food_onhand', None)
if recipe := validated_data.get('recipe', None):
validated_data['recipe'] = Recipe.objects.get(**recipe)
# assuming if on hand for user also onhand for shopping_share users # assuming if on hand for user also onhand for shopping_share users
if not onhand is None: if not onhand is None:

View File

@@ -109,7 +109,7 @@ in combination with [jrcs's letsencrypt companion](https://hub.docker.com/r/jrcs
Please refer to the appropriate documentation on how to setup the reverse proxy and networks. Please refer to the appropriate documentation on how to setup the reverse proxy and networks.
!!!!!!warning "Adjust client_max_body_size" !!! warning "Adjust client_max_body_size"
By using jwilder's Nginx-proxy, uploads will be restricted to 1 MB file size. This can be resolved by adjusting the ```client_max_body_size``` variable in the jwilder nginx configuration. By using jwilder's Nginx-proxy, uploads will be restricted to 1 MB file size. This can be resolved by adjusting the ```client_max_body_size``` variable in the jwilder nginx configuration.
Remember to add the appropriate environment variables to the `.env` file: Remember to add the appropriate environment variables to the `.env` file:

View File

@@ -390,6 +390,8 @@ JS_REVERSE_SCRIPT_PREFIX = os.getenv('JS_REVERSE_SCRIPT_PREFIX', SCRIPT_NAME)
STATIC_URL = os.getenv('STATIC_URL', '/static/') STATIC_URL = os.getenv('STATIC_URL', '/static/')
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles") STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
AWS_ENABLED = True if os.getenv('S3_ACCESS_KEY', False) else False
if os.getenv('S3_ACCESS_KEY', ''): if os.getenv('S3_ACCESS_KEY', ''):
DEFAULT_FILE_STORAGE = 'cookbook.helper.CustomStorageClass.CachedS3Boto3Storage' DEFAULT_FILE_STORAGE = 'cookbook.helper.CustomStorageClass.CachedS3Boto3Storage'

View File

@@ -1,7 +1,7 @@
Django==3.2.12 Django==3.2.12
cryptography==36.0.1 cryptography==36.0.2
django-annoying==0.10.6 django-annoying==0.10.6
django-autocomplete-light==3.8.2 django-autocomplete-light==3.9.4
django-cleanup==6.0.0 django-cleanup==6.0.0
django-crispy-forms==1.14.0 django-crispy-forms==1.14.0
django-filter==21.1 django-filter==21.1
@@ -11,32 +11,32 @@ drf-writable-nested==0.6.3
bleach==4.1.0 bleach==4.1.0
bleach-allowlist==1.0.3 bleach-allowlist==1.0.3
gunicorn==20.1.0 gunicorn==20.1.0
lxml==4.7.1 lxml==4.8.0
Markdown==3.3.6 Markdown==3.3.6
Pillow==9.0.1 Pillow==9.0.1
psycopg2-binary==2.9.3 psycopg2-binary==2.9.3
python-dotenv==0.19.2 python-dotenv==0.20.0
requests==2.27.1 requests==2.27.1
six==1.16.0 six==1.16.0
webdavclient3==3.14.6 webdavclient3==3.14.6
whitenoise==5.3.0 whitenoise==6.0.0
icalendar==4.0.9 icalendar==4.0.9
pyyaml==6.0 pyyaml==6.0
uritemplate==4.1.1 uritemplate==4.1.1
beautifulsoup4==4.10.0 beautifulsoup4==4.10.0
microdata==0.8.0 microdata==0.8.0
Jinja2==3.0.3 Jinja2==3.1.1
django-webpack-loader==1.4.1 django-webpack-loader==1.4.1
django-js-reverse==0.9.1 django-js-reverse==0.9.1
django-allauth==0.47.0 django-allauth==0.50.0
recipe-scrapers==13.19.0 recipe-scrapers==13.25.0
django-scopes==1.2.0 django-scopes==1.2.0
pytest==6.2.5 pytest==7.1.1
pytest-django==4.5.2 pytest-django==4.5.2
django-treebeard==4.5.1 django-treebeard==4.5.1
django-cors-headers==3.11.0 django-cors-headers==3.11.0
django-storages==1.12.3 django-storages==1.12.3
boto3==1.20.47 boto3==1.21.31
django-prometheus==2.2.0 django-prometheus==2.2.0
django-hCaptcha==0.2.0 django-hCaptcha==0.2.0
python-ldap==3.4.0 python-ldap==3.4.0

View File

@@ -1,89 +1,89 @@
{ {
"name": "vue", "name": "vue",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"scripts": { "scripts": {
"serve": "vue-cli-service serve", "serve": "vue-cli-service serve",
"build": "vue-cli-service build", "build": "vue-cli-service build",
"lint": "vue-cli-service lint" "lint": "vue-cli-service lint"
},
"dependencies": {
"@babel/eslint-parser": "^7.16.0",
"@kangc/v-md-editor": "^1.7.7",
"@kevinfaguiar/vue-twemoji-picker": "^5.7.4",
"@popperjs/core": "^2.11.2",
"@riophae/vue-treeselect": "^0.4.0",
"@vue/cli": "^5.0.4",
"axios": "^0.26.1",
"bootstrap-vue": "^2.21.2",
"core-js": "^3.20.3",
"html2pdf.js": "^0.10.1",
"lodash": "^4.17.21",
"moment": "^2.29.1",
"prismjs": "^1.27.0",
"vue": "^2.6.14",
"vue-class-component": "^7.2.3",
"vue-click-outside": "^1.1.0",
"vue-clickaway": "^2.2.2",
"vue-cookies": "^1.7.4",
"vue-i18n": "^8.26.8",
"vue-infinite-loading": "^2.4.5",
"vue-multiselect": "^2.1.6",
"vue-property-decorator": "^9.1.2",
"vue-simple-calendar": "^5.0.1",
"vue-template-compiler": "^2.6.14",
"vue2-touch-events": "^3.2.2",
"vuedraggable": "^2.24.3",
"vuex": "^3.6.0",
"workbox-webpack-plugin": "^6.3.0"
},
"devDependencies": {
"@kazupon/vue-i18n-loader": "^0.5.0",
"@typescript-eslint/eslint-plugin": "^4.33.0",
"@typescript-eslint/parser": "^4.32.0",
"@vue/cli-plugin-babel": "~4.5.13",
"@vue/cli-plugin-eslint": "~5.0.4",
"@vue/cli-plugin-pwa": "~4.5.13",
"@vue/cli-plugin-typescript": "^4.5.15",
"@vue/cli-service": "~4.5.15",
"@vue/compiler-sfc": "^3.2.29",
"@vue/eslint-config-typescript": "^10.0.0",
"babel-eslint": "^10.1.0",
"eslint": "^7.28.0",
"eslint-plugin-vue": "^8.0.3",
"typescript": "~4.5.5",
"vue-cli-plugin-i18n": "^2.1.1",
"webpack-bundle-tracker": "1.4.0",
"workbox-expiration": "^6.3.0",
"workbox-navigation-preload": "^6.0.2",
"workbox-precaching": "^6.3.0",
"workbox-routing": "^6.5.0",
"workbox-strategies": "^6.2.4"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
}, },
"dependencies": { "extends": [
"@babel/eslint-parser": "^7.16.0", "plugin:vue/vue3-essential",
"@kangc/v-md-editor": "^1.7.7", "eslint:recommended",
"@kevinfaguiar/vue-twemoji-picker": "^5.7.4", "@vue/typescript"
"@popperjs/core": "^2.10.1",
"@riophae/vue-treeselect": "^0.4.0",
"axios": "^0.24.0",
"bootstrap-vue": "^2.21.2",
"core-js": "^3.20.3",
"html2pdf.js": "^0.10.1",
"lodash": "^4.17.21",
"moment": "^2.29.1",
"prismjs": "^1.27.0",
"vue": "^2.6.14",
"vue-class-component": "^7.2.3",
"vue-click-outside": "^1.1.0",
"vue-clickaway": "^2.2.2",
"vue-cookies": "^1.7.4",
"vue-i18n": "^8.26.8",
"vue-infinite-loading": "^2.4.5",
"vue-jstree": "^2.1.6",
"vue-multiselect": "^2.1.6",
"vue-property-decorator": "^9.1.2",
"vue-simple-calendar": "^5.0.1",
"vue-template-compiler": "^2.6.14",
"vue2-touch-events": "^3.2.2",
"vuedraggable": "^2.24.3",
"vuex": "^3.6.0",
"workbox-webpack-plugin": "^6.3.0"
},
"devDependencies": {
"@kazupon/vue-i18n-loader": "^0.5.0",
"@typescript-eslint/eslint-plugin": "^4.33.0",
"@typescript-eslint/parser": "^4.32.0",
"@vue/cli-plugin-babel": "~4.5.13",
"@vue/cli-plugin-eslint": "~4.5.15",
"@vue/cli-plugin-pwa": "~4.5.13",
"@vue/cli-plugin-typescript": "^4.5.15",
"@vue/cli-service": "~4.5.15",
"@vue/compiler-sfc": "^3.2.29",
"@vue/eslint-config-typescript": "^10.0.0",
"babel-eslint": "^10.1.0",
"eslint": "^7.28.0",
"eslint-plugin-vue": "^8.0.3",
"typescript": "~4.5.5",
"vue-cli-plugin-i18n": "^2.1.1",
"webpack-bundle-tracker": "1.4.0",
"workbox-expiration": "^6.3.0",
"workbox-navigation-preload": "^6.0.2",
"workbox-precaching": "^6.3.0",
"workbox-routing": "^6.3.0",
"workbox-strategies": "^6.2.4"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/vue3-essential",
"eslint:recommended",
"@vue/typescript"
],
"parserOptions": {
"parser": "@typescript-eslint/parser"
},
"rules": {
"no-unused-vars": "off"
}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
], ],
"resolutions": { "parserOptions": {
"@vue/cli-plugin-pwa/workbox-webpack-plugin": "^5.1.3", "parser": "@typescript-eslint/parser"
"coa": "2.0.2" },
"rules": {
"no-unused-vars": "off"
} }
} },
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
],
"resolutions": {
"@vue/cli-plugin-pwa/workbox-webpack-plugin": "^5.1.3",
"coa": "2.0.2"
}
}

View File

@@ -79,7 +79,7 @@
:loading="keywords_loading" :loading="keywords_loading"
@search-change="searchKeywords" @search-change="searchKeywords"
> >
<template v-slot:noOptions>{{ $t("empty_list") }}</template> <template v-slot:noOptions>{{ $t("empty_list") }}</template>
</multiselect> </multiselect>
</div> </div>
</div> </div>
@@ -140,6 +140,24 @@
</div> </div>
</b-collapse> </b-collapse>
</div> </div>
<b-card-header header-tag="header" class="p-1" role="tab">
<b-button squared block v-b-toggle.additional_collapse class="text-left" variant="outline-primary">{{ $t("additional_options") }}</b-button>
</b-card-header>
<b-collapse id="additional_collapse" class="mt-2" v-model="additional_visible">
<b-form-group>
<b-input-group-append>
<b-input-group-text squared> {{ $t("Create Food") }}</b-input-group-text>
<b-input-group-text squared>
<b-form-checkbox v-model="recipe.create_food"></b-form-checkbox>
</b-input-group-text>
<b-input-group-text squared v-if="recipe.create_food"> {{ $t("Name") }}</b-input-group-text>
<b-form-input squared v-if="recipe.create_food" v-model="recipe.food_name" id="food_name"></b-form-input>
</b-input-group-append>
<em class="small text-muted">
{{ $t("create_food_desc") }}
</em>
</b-form-group>
</b-collapse>
</div> </div>
</div> </div>
@@ -260,7 +278,7 @@
style="flex-grow: 1; flex-shrink: 1; flex-basis: 0" style="flex-grow: 1; flex-shrink: 1; flex-basis: 0"
@search-change="searchFiles" @search-change="searchFiles"
> >
<template v-slot:noOptions>{{ $t("empty_list") }}</template> <template v-slot:noOptions>{{ $t("empty_list") }}</template>
</multiselect> </multiselect>
<b-input-group-append> <b-input-group-append>
<b-button <b-button
@@ -300,7 +318,7 @@
:loading="recipes_loading" :loading="recipes_loading"
@search-change="searchRecipes" @search-change="searchRecipes"
> >
<template v-slot:noOptions>{{ $t("empty_list") }}</template> <template v-slot:noOptions>{{ $t("empty_list") }}</template>
</multiselect> </multiselect>
</div> </div>
</div> </div>
@@ -364,7 +382,7 @@
:loading="units_loading" :loading="units_loading"
@search-change="searchUnits" @search-change="searchUnits"
> >
<template v-slot:noOptions>{{ $t("empty_list") }}</template> <template v-slot:noOptions>{{ $t("empty_list") }}</template>
</multiselect> </multiselect>
</div> </div>
<div class="col-lg-4 col-md-6 small-padding" v-if="!ingredient.is_header"> <div class="col-lg-4 col-md-6 small-padding" v-if="!ingredient.is_header">
@@ -394,7 +412,7 @@
:loading="foods_loading" :loading="foods_loading"
@search-change="searchFoods" @search-change="searchFoods"
> >
<template v-slot:noOptions>{{ $t("empty_list") }}</template> <template v-slot:noOptions>{{ $t("empty_list") }}</template>
</multiselect> </multiselect>
</div> </div>
<div class="small-padding" v-bind:class="{ 'col-lg-4 col-md-6': !ingredient.is_header, 'col-lg-12 col-md-12': ingredient.is_header }"> <div class="small-padding" v-bind:class="{ 'col-lg-4 col-md-6': !ingredient.is_header, 'col-lg-12 col-md-12': ingredient.is_header }">
@@ -619,6 +637,8 @@ export default {
paste_step: undefined, paste_step: undefined,
show_file_create: false, show_file_create: false,
step_for_file_create: undefined, step_for_file_create: undefined,
additional_visible: false,
create_food: undefined,
} }
}, },
computed: { computed: {
@@ -650,6 +670,12 @@ export default {
this.recipe_changed = this.recipe_changed !== undefined this.recipe_changed = this.recipe_changed !== undefined
}, },
}, },
"recipe.name": function () {
this.recipe.food_name = this.recipe.name.toLowerCase()
},
"recipe.create_food": function () {
this.create_food = this.recipe.create_food
},
}, },
methods: { methods: {
keyboardListener: function (e) { keyboardListener: function (e) {
@@ -736,6 +762,9 @@ export default {
.then((response) => { .then((response) => {
StandardToasts.makeStandardToast(StandardToasts.SUCCESS_UPDATE) StandardToasts.makeStandardToast(StandardToasts.SUCCESS_UPDATE)
this.recipe_changed = false this.recipe_changed = false
if (this.create_food) {
apiFactory.createFood({ name: this.recipe.food_name, recipe: { id: this.recipe.id, name: this.recipe.name } })
}
if (view_after) { if (view_after) {
location.href = resolveDjangoUrl("view_recipe", this.recipe_id) location.href = resolveDjangoUrl("view_recipe", this.recipe_id)
} }

View File

@@ -123,9 +123,9 @@
<div class="collapse" :id="'section-' + sectionID(x, i)" visible role="tabpanel" :class="{ show: x == 'false' }"> <div class="collapse" :id="'section-' + sectionID(x, i)" visible role="tabpanel" :class="{ show: x == 'false' }">
<!-- passing an array of values to the table grouped by Food --> <!-- passing an array of values to the table grouped by Food -->
<transition-group name="slide-fade"> <transition-group name="slide-fade">
<div class="mx-4" v-for="(entries, x) in Object.entries(s)" :key="x"> <div class="ml-4 mr-0" v-for="(entries, x) in Object.entries(s)" :key="x">
<transition name="slide-fade" mode="out-in"> <transition name="slide-fade" mode="out-in">
<ShoppingLineItem <shopping-line-item
:entries="entries[1]" :entries="entries[1]"
:groupby="group_by" :groupby="group_by"
:settings="settings" :settings="settings"

View File

@@ -1,13 +1,13 @@
<template> <template>
<div id="shopping_line_item"> <div id="shopping_line_item">
<b-row align-h="start"> <b-row align-h="start">
<b-col cols="3" md="2" class="justify-content-start align-items-center d-flex d-md-none pr-0" v-if="settings.left_handed"> <b-col cols="2" md="2" class="justify-content-start align-items-center d-flex d-md-none pr-0" v-if="settings.left_handed">
<input type="checkbox" class="form-control form-control-sm checkbox-control-mobile" :checked="formatChecked" @change="updateChecked" :key="entries[0].id" /> <input type="checkbox" class="form-control form-control-sm checkbox-control-mobile" :checked="formatChecked" @change="updateChecked" :key="entries[0].id" />
<b-button size="sm" @click="showDetails = !showDetails" class="d-inline-block d-md-none p-0" variant="link"> <b-button size="sm" @click="showDetails = !showDetails" class="d-inline-block d-md-none p-0" variant="link">
<div class="text-nowrap"><i class="fa fa-chevron-right rotate" :class="showDetails ? 'rotated' : ''"></i></div> <div class="text-nowrap"><i class="fa fa-chevron-right rotate" :class="showDetails ? 'rotated' : ''"></i></div>
</b-button> </b-button>
</b-col> </b-col>
<b-col cols="1" md="1" class="align-items-center d-flex"> <b-col cols="1" class="align-items-center d-flex">
<div class="dropdown b-dropdown position-static inline-block" data-html2canvas-ignore="true" @click.stop="$emit('open-context-menu', $event, entries)"> <div class="dropdown b-dropdown position-static inline-block" data-html2canvas-ignore="true" @click.stop="$emit('open-context-menu', $event, entries)">
<button <button
aria-haspopup="true" aria-haspopup="true"
@@ -23,7 +23,7 @@
<b-col cols="1" class="px-1 justify-content-center align-items-center d-none d-md-flex"> <b-col cols="1" class="px-1 justify-content-center align-items-center d-none d-md-flex">
<input type="checkbox" class="form-control form-control-sm checkbox-control" :checked="formatChecked" @change="updateChecked" :key="entries[0].id" /> <input type="checkbox" class="form-control form-control-sm checkbox-control" :checked="formatChecked" @change="updateChecked" :key="entries[0].id" />
</b-col> </b-col>
<b-col cols="8" md="9"> <b-col cols="8" >
<b-row class="d-flex h-100"> <b-row class="d-flex h-100">
<b-col cols="6" md="3" class="d-flex align-items-center" v-if="Object.entries(formatAmount).length == 1"> <b-col cols="6" md="3" class="d-flex align-items-center" v-if="Object.entries(formatAmount).length == 1">
<strong class="mr-1">{{ Object.entries(formatAmount)[0][1] }}</strong> {{ Object.entries(formatAmount)[0][0] }} <strong class="mr-1">{{ Object.entries(formatAmount)[0][1] }}</strong> {{ Object.entries(formatAmount)[0][0] }}
@@ -47,7 +47,7 @@
</b-col> </b-col>
</b-row> </b-row>
</b-col> </b-col>
<b-col cols="3" md="2" class="justify-content-start align-items-center d-flex d-md-none" v-if="!settings.left_handed"> <b-col cols="2" class="justify-content-start align-items-center d-flex d-md-none pl-0 pr-0" v-if="!settings.left_handed">
<b-button size="sm" @click="showDetails = !showDetails" class="d-inline-block d-md-none p-0" variant="link"> <b-button size="sm" @click="showDetails = !showDetails" class="d-inline-block d-md-none p-0" variant="link">
<div class="text-nowrap"><i class="fa fa-chevron-right rotate" :class="showDetails ? 'rotated' : ''"></i></div> <div class="text-nowrap"><i class="fa fa-chevron-right rotate" :class="showDetails ? 'rotated' : ''"></i></div>
</b-button> </b-button>

View File

@@ -381,5 +381,8 @@
"Keyword": "Keyword", "Keyword": "Keyword",
"Advanced": "Advanced", "Advanced": "Advanced",
"Page": "Page", "Page": "Page",
"Reset": "Reset" "Reset": "Reset",
"Create Food": "Create Food",
"create_food_desc": "Create a food and link it to this recipe.",
"additional_options": "Additional Options"
} }

View File

@@ -109,7 +109,7 @@
"Settings": "Asetukset", "Settings": "Asetukset",
"or": "tai", "or": "tai",
"and": "ja", "and": "ja",
"Information": "Informaatio", "Information": "Tiedot",
"Download": "Lataa", "Download": "Lataa",
"Create": "Luo", "Create": "Luo",
"Advanced Search Settings": "Tarkennetun Haun Asetukset", "Advanced Search Settings": "Tarkennetun Haun Asetukset",
@@ -122,21 +122,21 @@
"move_confirmation": "Siirrä <i>{child}</i> yläluokkaan <i>{parent}</i>", "move_confirmation": "Siirrä <i>{child}</i> yläluokkaan <i>{parent}</i>",
"merge_confirmation": "Korvaa <i>{source}</i> esiintymiset <i>{target}:lla</i>", "merge_confirmation": "Korvaa <i>{source}</i> esiintymiset <i>{target}:lla</i>",
"create_rule": "ja luo automaatio", "create_rule": "ja luo automaatio",
"move_selection": "Valitse yläluokka {type} johon {suorce} siirretään.", "move_selection": "Valitse yläluokka {type} johon {source} siirretään.",
"merge_selection": "Korvaa kaikki {source} esiintymiset valitulla {type}:llä.", "merge_selection": "Korvaa kaikki {source} esiintymiset valitulla {type}:llä.",
"Root": "Root", "Root": "Root",
"Ignore_Shopping": "Ohita Ostokset", "Ignore_Shopping": "Ohita Ostokset",
"Shopping_Category": "Ostosluokka", "Shopping_Category": "Ostosluokka",
"Edit_Food": "Muokkaa Ruokaa", "Edit_Food": "Muokkaa ruokaa",
"Move_Food": "Siirrä Ruoka", "Move_Food": "Siirrä ruoka",
"New_Food": "Uusi Ruoka", "New_Food": "Uusi ruoka",
"Hide_Food": "Piilota Ruoka", "Hide_Food": "Piilota ruoka",
"Food_Alias": "Ruoan Nimimerkki", "Food_Alias": "Ruoan nimimerkki",
"Unit_Alias": "Yksikkö alias", "Unit_Alias": "Yksikköalias",
"Keyword_Alias": "Avainsana alias", "Keyword_Alias": "Avainsana-alias",
"Delete_Food": "Poista Ruoka", "Delete_Food": "Poista ruoka",
"No_ID": "Poistaminen epäonnistui, ID:tä ei löytynyt.", "No_ID": "Poistaminen epäonnistui, ID:tä ei löytynyt.",
"Meal_Plan_Days": "Tulevat Ruokasuunnitelmat", "Meal_Plan_Days": "Tulevat ruokasuunnitelmat",
"merge_title": "Yhdistä {type}", "merge_title": "Yhdistä {type}",
"move_title": "Siirrä {type}", "move_title": "Siirrä {type}",
"Food": "Ruoka", "Food": "Ruoka",
@@ -206,5 +206,11 @@
"Auto_Planner": "Automaattinen Suunnittelija", "Auto_Planner": "Automaattinen Suunnittelija",
"New_Cookbook": "Uusi keittokirja", "New_Cookbook": "Uusi keittokirja",
"Hide_Keyword": "Piilota avainsana", "Hide_Keyword": "Piilota avainsana",
"Clear": "Pyyhi" "Clear": "Pyyhi",
"err_moving_resource": "Resurssin siirtämisessä tapahtui virhe!",
"err_merging_resource": "Resurssin yhdistämisessä tapahtui virhe!",
"success_moving_resource": "Resurssin siirto onnistui!",
"success_merging_resource": "Resurssin yhdistäminen onnistui!",
"Search Settings": "Hakuasetukset",
"Shopping_Categories": "Ostoskategoriat"
} }

View File

@@ -285,5 +285,49 @@
"Create_Meal_Plan_Entry": "Créer une entrée de menu", "Create_Meal_Plan_Entry": "Créer une entrée de menu",
"RemoveFoodFromShopping": "Retirer lingrédient {food} de votre liste de courses", "RemoveFoodFromShopping": "Retirer lingrédient {food} de votre liste de courses",
"left_handed": "Mode gaucher", "left_handed": "Mode gaucher",
"left_handed_help": "Optimise linterface utilisateur pour une utilisation avec la main gauche." "left_handed_help": "Optimise linterface utilisateur pour une utilisation avec la main gauche.",
"Custom Filter": "Filtre personnalisé",
"shared_with": "Partagé avec",
"sort_by": "Trié par",
"desc": "Ordre décroissant",
"date_created": "Créé le",
"make_now": "Cuisiner maintenant",
"copy_to_new": "Copier dans une nouvelle recette",
"recipe_name": "Nom de la recette",
"paste_ingredients_placeholder": "Copier la liste d'ingrédients ici...",
"paste_ingredients": "Copier les ingrédients",
"ingredient_list": "Liste des ingrédients",
"search_no_recipes": "Aucune recettes trouvées !",
"substitute_siblings_help": "Tous les ingrédients qui partagent un parent avec cette ingrédient sont considérés comme des substituts.",
"OnHand_help": "L'ingrédient est dans l'inventaire et ne sera pas automatiquement ajouté à la liste de courses. Le status actuel est partagé avec les utilisateurs de la liste.",
"ignore_shopping_help": "Ne jamais ajouter l'ingrédient à la liste de courses (ex: eau)",
"food_recipe_help": "Ajouter un lien vers la recette ici incluera cette recette dans n'importe qu'elle autre recette qui utilise cet ingrédient",
"shopping_category_help": "Les supermarchés peuvent être triés et filtrés par catégorie d'ingrédients selon la disposition des rayons.",
"Units": "Unités",
"view_recipe": "Voir la recette",
"review_shopping": "Vérifier les éléments de la liste avant de sauvegarder",
"Select": "Sélectionner",
"Supermarkets": "Supermarchés",
"User": "Utilisateur",
"Keyword": "Mot-clé",
"Foods": "Ingrédients",
"enable_expert": "Activer le mode expert",
"show_rating": "Afficher les notes",
"asc": "Ordre croissant",
"book_filter_help": "Inclure les recettes filtrés en plus de celles ajoutées manuellement.",
"search_import_help_text": "Importer une recette depuis un site ou application externe.",
"search_create_help_text": "Créer une nouvelle recette directement dans Tandoor.",
"substitute_help": "Les substituts sont pris en compte lors d'une recherche de recettes pouvant être cuisinées avec les ingrédients disponibles.",
"remember_search": "Enregistrer la recherche",
"expert_mode": "Mode expert",
"simple_mode": "Mode simplifié",
"advanced": "Avancé",
"fields": "Champs",
"show_keywords": "Afficher les mots-clés",
"show_foods": "Afficher les ingrédients",
"show_books": "Afficher les livres",
"show_units": "Afficher les unités",
"show_filters": "Afficher les filtres",
"save_filter": "Sauvegarder le filtre",
"filter_name": "Filtrer par nom"
} }

View File

@@ -349,8 +349,8 @@
"ChildInheritFields_help": "", "ChildInheritFields_help": "",
"InheritFields_help": "", "InheritFields_help": "",
"last_viewed": "", "last_viewed": "",
"created_on": "", "created_on": "Criado em",
"updatedon": "", "updatedon": "Atualizado em",
"advanced_search_settings": "", "advanced_search_settings": "",
"nothing_planned_today": "", "nothing_planned_today": "",
"no_pinned_recipes": "", "no_pinned_recipes": "",
@@ -358,7 +358,7 @@
"Pinned": "", "Pinned": "",
"Quick actions": "", "Quick actions": "",
"Ratings": "", "Ratings": "",
"Internal": "", "Internal": "Interno",
"Units": "", "Units": "",
"Random Recipes": "", "Random Recipes": "",
"parameter_count": "", "parameter_count": "",
@@ -372,7 +372,7 @@
"empty_list": "", "empty_list": "",
"Select": "", "Select": "",
"Supermarkets": "", "Supermarkets": "",
"User": "", "User": "Utilizador",
"Keyword": "", "Keyword": "",
"Advanced": "", "Advanced": "",
"Page": "", "Page": "",

View File

@@ -1,11 +1,11 @@
{ {
"import_running": "Import pågår, var god vänta!", "import_running": "Importering pågår, var god vänta!",
"all_fields_optional": "Alla rutor är valfria och kan lämnas tomma.", "all_fields_optional": "Alla rutor är valfria och kan lämnas tomma.",
"convert_internal": "Konvertera till internt recept", "convert_internal": "Konvertera till internt recept",
"Log_Recipe_Cooking": "Logga tillagningen av receptet", "Log_Recipe_Cooking": "Logga tillagningen av receptet",
"External_Recipe_Image": "Externt receptbild", "External_Recipe_Image": "Extern receptbild",
"Add_to_Book": "Lägg till i kokbok", "Add_to_Book": "Lägg till i kokbok",
"Add_to_Shopping": "Lägg till i handelslista", "Add_to_Shopping": "Lägg till i inköpslista",
"Add_to_Plan": "Lägg till i matsedel", "Add_to_Plan": "Lägg till i matsedel",
"Step_start_time": "Steg starttid", "Step_start_time": "Steg starttid",
"Select_Book": "Välj kokbok", "Select_Book": "Välj kokbok",
@@ -17,7 +17,7 @@
"Fats": "Fett", "Fats": "Fett",
"Carbohydrates": "Kolhydrater", "Carbohydrates": "Kolhydrater",
"Calories": "Kalorier", "Calories": "Kalorier",
"Energy": "", "Energy": "Energi",
"Nutrition": "Näringsinnehåll", "Nutrition": "Näringsinnehåll",
"Date": "Datum", "Date": "Datum",
"Share": "Dela", "Share": "Dela",
@@ -37,5 +37,185 @@
"Search": "Sök", "Search": "Sök",
"Import": "Importera", "Import": "Importera",
"Print": "Skriv ut", "Print": "Skriv ut",
"Information": "Information" "Information": "Information",
"Link": "Länk",
"Copy": "Kopiera",
"Key_Ctrl": "Ctrl",
"Sort_by_new": "Sortera efter ny",
"Recipes_per_page": "Recept per sida",
"Table_of_Contents": "Innehållsförteckning",
"Books": "Böcker",
"New_Recipe": "Nytt recept",
"Recently_Viewed": "Nyligen visade",
"create_rule": "och skapa automation",
"Root": "Rot",
"External": "Extern",
"Settings": "Inställningar",
"New": "Ny",
"Meal_Plan": "Måltidsplanering",
"Categories": "Kategorier",
"Category": "Kategori",
"Selected": "Vald",
"Supermarket": "Mataffär",
"Files": "Filer",
"Size": "Storlek",
"err_creating_resource": "Det uppstod ett fel när en resurs skulle skapas!",
"err_updating_resource": "Det uppstod ett fel när en resurs skulle uppdateras!",
"err_fetching_resource": "Det uppstod ett fel när en resurs skulle hämtas!",
"success_fetching_resource": "En resurs har hämtats!",
"err_deleting_resource": "Det uppstod ett fel när en resurs skulle tas bort!",
"success_updating_resource": "En resurs har uppdaterats!",
"Remove_nutrition_recipe": "Ta bort näring från receptet",
"Add_nutrition_recipe": "Lägg till näring till receptet",
"New_Keyword": "Nytt nyckelord",
"Automation": "Automatisering",
"Parameter": "Parameter",
"Download": "Ladda ned",
"and": "och",
"Ok": "Öppna",
"Create": "Skapa",
"Ignore_Shopping": "Ignorera handling",
"or": "eller",
"Create_New_Keyword": "Lägg till nytt nyckelord",
"No_Results": "Inget resultat",
"New_Unit": "Ny enhet",
"create_title": "Ny {type}",
"Drag_Here_To_Delete": "Dra hit för att radera",
"Meal_Type_Required": "Måltidstyp är obligatorisk",
"Clone": "Klona",
"Reset_Search": "Rensa sök",
"Title_or_Recipe_Required": "Val av titel eller recept krävs",
"success_creating_resource": "En resurs har skapats!",
"Time": "Tid",
"Text": "Text",
"Empty": "Tom",
"and_up": "& ned",
"Cancel": "Avbryt",
"Failure": "Misslyckas",
"File": "Fil",
"Delete": "Radera",
"edit_title": "Redigera {type}",
"Description": "Beskrivning",
"Recipe": "Recept",
"Icon": "Ikon",
"Unit": "Enhet",
"Name": "Namn",
"Type": "Typ",
"No_ID": "ID hittades inte, kan inte radera.",
"Create_New_Unit": "Lägg till enhet",
"Export_As_ICal": "Exportera nuvarande period till iCal format",
"Auto_Planner": "Autoplanera",
"Show_as_header": "Visa som rubrik",
"Hide_as_header": "Göm som rubrik",
"Copy_template_reference": "Kopiera mallreferens",
"Save_and_View": "Spara & visa",
"step_time_minutes": "Stegets tid i minuter",
"Url_Import": "Länk import",
"Delete_Keyword": "Ta bort nyckelord",
"Edit_Keyword": "Redigera nyckelord",
"confirm_delete": "Är du säker på att du vill radera detta {object}?",
"Move_Keyword": "Flytta nyckelord",
"Edit_Recipe": "Redigera recept",
"Merge_Keyword": "Slå samman nyckelord",
"Hide_Keywords": "Dölj nyckelord",
"Hide_Recipes": "Dölj recept",
"Move_Up": "Flytta upp",
"Move_Down": "Flytta ned",
"Step_Name": "Stegets namn",
"Step_Type": "Stegets typ",
"Make_Ingredient": "Skapa ingrediens",
"Enable_Amount": "Aktivera belopp",
"Disable_Amount": "Inaktivera belopp",
"move_title": "Flytta {type}",
"merge_title": "Slå samman {type}",
"Food": "Mat",
"Key_Shift": "Shift",
"Instructions": "Instruktioner",
"and_down": "& up",
"Added_by": "Tillagd av",
"Title": "Titel",
"Week": "Vecka",
"Month": "Månad",
"Year": "År",
"Period": "Period",
"Undefined": "Odefinierad",
"Periods": "Perioder",
"Plan_Period_To_Show": "Visa veckor, månader eller år",
"Color": "Färg",
"Plan_Show_How_Many_Periods": "Hur många perioder ska visas",
"Starting_Day": "Startdag i veckan",
"Meal_Types": "Måltidstyper",
"Meal_Type": "Måltidstyp",
"New_Meal_Type": "Ny måltidstyp",
"AddFoodToShopping": "Lägg till {food} på din inköpslista",
"RemoveFoodFromShopping": "Ta bort {mat} från din inköpslista",
"DeleteShoppingConfirm": "Är du säker på att du vill ta bort all {food} från inköpslistan?",
"Week_Numbers": "Veckonummer",
"Show_Week_Numbers": "Visa veckonummer?",
"Export_To_ICal": "Exportera .ics",
"Next_Day": "Nästa dag",
"Previous_Day": "Föregående dag",
"GroupBy": "Gruppera enligt",
"Next_Period": "Nästa period",
"Previous_Period": "Föregående period",
"Current_Period": "Nuvarande period",
"Inherit": "Ärva",
"InheritFields": "Ärv fältvärden",
"NoCategory": "Ingen kategori vald.",
"show_split_screen": "Delad vy",
"Warning": "Varning",
"Reset": "Återställa",
"select_unit": "Välj enhet",
"select_food": "Välj mat",
"remove_selection": "Avmarkera",
"Select": "Välj",
"Supermarkets": "Mataffärer",
"User": "Användare",
"Keyword": "Nyckelord",
"Advanced": "Avancerat",
"Page": "Sida",
"select_keyword": "Välj nyckelord",
"add_keyword": "Lägg till nyckelord",
"select_file": "Välj fil",
"select_recipe": "Välj recept",
"Units": "Enheter",
"last_viewed": "Senast visad",
"empty_list": "Listan är tom.",
"Load_More": "Ladda mer",
"Make_Header": "Skapa rubrik",
"err_moving_resource": "Det uppstod ett fel när en resurs skulle flyttas!",
"err_merging_resource": "Det uppstod ett fel när en resurs skulle slås ihop!",
"success_moving_resource": "En resurs har flyttats!",
"success_merging_resource": "En resurs har slagits samman!",
"Select_File": "Välj fil",
"Add_Step": "Lägg till steg",
"Note": "Anteckning",
"Success": "Lyckas",
"Image": "Bild",
"View": "Visa",
"Recipes": "Recept",
"Merge": "Slå samman",
"delete_confirmation": "Är du säker på att du vill radera {source}?",
"delete_title": "Radera {type}",
"Keyword_Alias": "Nyckelord alias",
"Recipe_Book": "Receptbok",
"Search Settings": "Sökinställningar",
"warning_feature_beta": "Den här funktionen är för närvarande i ett BETA-läge (testning). Vänligen förvänta dig buggar och eventuellt brytande ändringar i framtiden (möjligen att förlora funktionsrelaterad data) när du använder den här funktionen.",
"success_deleting_resource": "En resurs har raderats!",
"file_upload_disabled": "Filuppladdning är inte aktiverat för ditt utrymme.",
"show_only_internal": "Visa endast interna recept",
"Manage_Books": "Hantera böcker",
"Keywords": "Nyckelord",
"Move": "Flytta",
"Parent": "Förälder",
"merge_selection": "Ersätt alla förekomster av {source} med den valda {type}.",
"Shopping_Category": "Shopping kategori",
"move_selection": "Välj en förälder {type} att flytta {source} till.",
"Create_New_Shopping Category": "Skapa ny shoppingkategori",
"Create_New_Meal_Type": "Lägg till ny måltidstyp",
"tree_root": "Roten av trädet",
"Meal_Plan_Days": "Framtida måltidsplaner",
"Automate": "Automatisera",
"Shopping_Categories": "Shopping kategorier",
"Unit_Alias": "Enhetsalias"
} }

File diff suppressed because it is too large Load Diff