mirror of
https://github.com/TandoorRecipes/recipes.git
synced 2025-12-28 20:49:22 -05:00
Compare commits
103 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
100b75a5d2 | ||
|
|
7dba36d210 | ||
|
|
0dea5c9877 | ||
|
|
1777dfe821 | ||
|
|
2b6edfb96d | ||
|
|
faa3c99965 | ||
|
|
1cc5a0a094 | ||
|
|
cbafbd44a4 | ||
|
|
f16a804758 | ||
|
|
c30e1bb43a | ||
|
|
31051086ba | ||
|
|
67d3c852dd | ||
|
|
4ea9b10fc4 | ||
|
|
e609f4e0e0 | ||
|
|
b9ee2611a3 | ||
|
|
8de3c41958 | ||
|
|
2a350a9bbe | ||
|
|
89c4c09481 | ||
|
|
a97b023504 | ||
|
|
4aa7152ab4 | ||
|
|
80ff8ddb12 | ||
|
|
45aeeaa069 | ||
|
|
0c24db72c6 | ||
|
|
95c4d72b74 | ||
|
|
1330c0e7a3 | ||
|
|
9af22bcf9f | ||
|
|
d24214c463 | ||
|
|
e8101dd433 | ||
|
|
94bd343eed | ||
|
|
f409633ade | ||
|
|
e927418535 | ||
|
|
be9f9d68db | ||
|
|
3a002cce9e | ||
|
|
416ddf3d34 | ||
|
|
8b0a19c6a2 | ||
|
|
757fa1b768 | ||
|
|
736d829bd0 | ||
|
|
6829d5351d | ||
|
|
805eb87754 | ||
|
|
e910ec4a51 | ||
|
|
4c0ace1d84 | ||
|
|
cae26e7fe0 | ||
|
|
8d070349a6 | ||
|
|
166697d791 | ||
|
|
90d93b733d | ||
|
|
272d2e94a1 | ||
|
|
f84a401714 | ||
|
|
f6b19d40b1 | ||
|
|
969b7ba492 | ||
|
|
c9edec6308 | ||
|
|
9f0ff1348c | ||
|
|
c85d62fc66 | ||
|
|
dae51a8d3e | ||
|
|
d522534a12 | ||
|
|
a38308a24a | ||
|
|
b981960221 | ||
|
|
7d1461a752 | ||
|
|
24a589fe41 | ||
|
|
b1d28a46c3 | ||
|
|
6b376fbfbb | ||
|
|
c532b1f94f | ||
|
|
26ab7f5580 | ||
|
|
72c638ca6f | ||
|
|
5478b7d550 | ||
|
|
e6eacc48d6 | ||
|
|
0259e000e3 | ||
|
|
eb0a95f594 | ||
|
|
41ee8cf66f | ||
|
|
8c8834e6aa | ||
|
|
145abfa344 | ||
|
|
f60e61e331 | ||
|
|
fd534aba95 | ||
|
|
f23c99f5ea | ||
|
|
1a14cc9513 | ||
|
|
e98131ce7a | ||
|
|
7cff47efab | ||
|
|
1dcc3e06d4 | ||
|
|
9125921038 | ||
|
|
eea2a2c252 | ||
|
|
9554c69a39 | ||
|
|
506ab0f0c7 | ||
|
|
3e26ca5c68 | ||
|
|
3fa8a9f27e | ||
|
|
0cdff07e4b | ||
|
|
8a142c3b11 | ||
|
|
20ca7151d1 | ||
|
|
15abe9f24b | ||
|
|
754b7c3376 | ||
|
|
00b02248d3 | ||
|
|
fda302ebb6 | ||
|
|
70cd675aa1 | ||
|
|
960db5aaab | ||
|
|
8daf43d6e8 | ||
|
|
114ca55b26 | ||
|
|
59f5219c0b | ||
|
|
bc465c7b2f | ||
|
|
bf1b2db415 | ||
|
|
9085756fca | ||
|
|
db43bd1962 | ||
|
|
3c13c06ce1 | ||
|
|
beb1823a57 | ||
|
|
b6fa74c601 | ||
|
|
596b6c6f98 |
@@ -16,15 +16,11 @@ class CookbookConfig(AppConfig):
|
||||
import cookbook.signals # noqa
|
||||
|
||||
if not settings.DISABLE_EXTERNAL_CONNECTORS:
|
||||
try:
|
||||
from cookbook.connectors.connector_manager import ConnectorManager # Needs to be here to prevent loading race condition of oauth2 modules in models.py
|
||||
handler = ConnectorManager()
|
||||
post_save.connect(handler, dispatch_uid="connector_manager")
|
||||
post_delete.connect(handler, dispatch_uid="connector_manager")
|
||||
except Exception as e:
|
||||
traceback.print_exc()
|
||||
print('Failed to initialize connectors')
|
||||
pass
|
||||
from cookbook.connectors.connector_manager import ConnectorManager # Needs to be here to prevent loading race condition of oauth2 modules in models.py
|
||||
handler = ConnectorManager()
|
||||
post_save.connect(handler, dispatch_uid="post_save-connector_manager")
|
||||
post_delete.connect(handler, dispatch_uid="post_delete-connector_manager")
|
||||
|
||||
# if not settings.DISABLE_TREE_FIX_STARTUP:
|
||||
# # when starting up run fix_tree to:
|
||||
# # a) make sure that nodes are sorted when switching between sort modes
|
||||
@@ -45,4 +41,4 @@ class CookbookConfig(AppConfig):
|
||||
# except Exception:
|
||||
# if DEBUG:
|
||||
# traceback.print_exc()
|
||||
# pass # dont break startup just because fix could not run, need to investigate cases when this happens
|
||||
# pass # dont break startup just because fix could not run, need to investigate cases when this happens
|
||||
@@ -31,6 +31,15 @@ class Work:
|
||||
actionType: ActionType
|
||||
|
||||
|
||||
class Singleton(type):
|
||||
_instances = {}
|
||||
|
||||
def __call__(cls, *args, **kwargs):
|
||||
if cls not in cls._instances:
|
||||
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
|
||||
return cls._instances[cls]
|
||||
|
||||
|
||||
# The way ConnectionManager works is as follows:
|
||||
# 1. On init, it starts a worker & creates a queue for 'Work'
|
||||
# 2. Then any time its called, it verifies the type of action (create/update/delete) and if the item is of interest, pushes the Work (non-blocking) to the queue.
|
||||
@@ -39,7 +48,8 @@ class Work:
|
||||
# 3.2 If work is of type REGISTERED_CLASSES, it asynchronously fires of all connectors and wait for them to finish (runtime should depend on the 'slowest' connector)
|
||||
# 4. Work is marked as consumed, and next entry of the queue is consumed.
|
||||
# Each 'Work' is processed in sequential by the worker, so the throughput is about [workers * the slowest connector]
|
||||
class ConnectorManager:
|
||||
# The Singleton class is used for ConnectorManager to have a self-reference and so Python does not garbage collect it
|
||||
class ConnectorManager(metaclass=Singleton):
|
||||
_logger: Logger
|
||||
_queue: queue.Queue
|
||||
_listening_to_classes = REGISTERED_CLASSES | ConnectorConfig
|
||||
|
||||
@@ -3,7 +3,7 @@ from logging import Logger
|
||||
from typing import Dict, Tuple
|
||||
from urllib.parse import urljoin
|
||||
|
||||
from aiohttp import ClientError, request
|
||||
from aiohttp import request, ClientResponseError
|
||||
|
||||
from cookbook.connectors.connector import Connector
|
||||
from cookbook.models import ShoppingListEntry, ConnectorConfig, Space
|
||||
@@ -13,6 +13,8 @@ class HomeAssistant(Connector):
|
||||
_config: ConnectorConfig
|
||||
_logger: Logger
|
||||
|
||||
_required_foreign_keys = ("food", "unit", "created_by")
|
||||
|
||||
def __init__(self, config: ConnectorConfig):
|
||||
if not config.token or not config.url or not config.todo_entity:
|
||||
raise ValueError("config for HomeAssistantConnector in incomplete")
|
||||
@@ -38,18 +40,20 @@ class HomeAssistant(Connector):
|
||||
|
||||
item, description = _format_shopping_list_entry(shopping_list_entry)
|
||||
|
||||
self._logger.debug(f"adding {item=}")
|
||||
self._logger.debug(f"adding {item=} with {description=} to {self._config.todo_entity}")
|
||||
|
||||
data = {
|
||||
"entity_id": self._config.todo_entity,
|
||||
"item": item,
|
||||
"description": description,
|
||||
}
|
||||
|
||||
if self._config.supports_description_field:
|
||||
data["description"] = description
|
||||
|
||||
try:
|
||||
await self.homeassistant_api_call("POST", "services/todo/add_item", data)
|
||||
except ClientError as err:
|
||||
self._logger.warning(f"received an exception from the api: {err=}, {type(err)=}")
|
||||
except ClientResponseError as err:
|
||||
self._logger.warning(f"received an exception from the api: {err.request_info.url=}, {err.request_info.method=}, {err.status=}, {err.message=}, {type(err)=}")
|
||||
|
||||
async def on_shopping_list_entry_updated(self, space: Space, shopping_list_entry: ShoppingListEntry) -> None:
|
||||
if not self._config.on_shopping_list_entry_updated_enabled:
|
||||
@@ -60,14 +64,14 @@ class HomeAssistant(Connector):
|
||||
if not self._config.on_shopping_list_entry_deleted_enabled:
|
||||
return
|
||||
|
||||
if not hasattr(shopping_list_entry._state.fields_cache, "food"):
|
||||
if not all(k in shopping_list_entry._state.fields_cache for k in self._required_foreign_keys):
|
||||
# Sometimes the food foreign key is not loaded, and we cant load it from an async process
|
||||
self._logger.debug("required property was not present in ShoppingListEntry")
|
||||
return
|
||||
|
||||
item, _ = _format_shopping_list_entry(shopping_list_entry)
|
||||
|
||||
self._logger.debug(f"removing {item=}")
|
||||
self._logger.debug(f"removing {item=} from {self._config.todo_entity}")
|
||||
|
||||
data = {
|
||||
"entity_id": self._config.todo_entity,
|
||||
@@ -76,9 +80,9 @@ class HomeAssistant(Connector):
|
||||
|
||||
try:
|
||||
await self.homeassistant_api_call("POST", "services/todo/remove_item", data)
|
||||
except ClientError as err:
|
||||
except ClientResponseError as err:
|
||||
# This error will always trigger if the item is not present/found
|
||||
self._logger.debug(f"received an exception from the api: {err=}, {type(err)=}")
|
||||
self._logger.debug(f"received an exception from the api: {err.request_info.url=}, {err.request_info.method=}, {err.status=}, {err.message=}, {type(err)=}")
|
||||
|
||||
async def close(self) -> None:
|
||||
pass
|
||||
|
||||
@@ -89,12 +89,13 @@ class ImportExportBase(forms.Form):
|
||||
COOKMATE = 'COOKMATE'
|
||||
REZEPTSUITEDE = 'REZEPTSUITEDE'
|
||||
PDF = 'PDF'
|
||||
GOURMET = 'GOURMET'
|
||||
|
||||
type = forms.ChoiceField(choices=((DEFAULT, _('Default')), (PAPRIKA, 'Paprika'), (NEXTCLOUD, 'Nextcloud Cookbook'), (MEALIE, 'Mealie'), (CHOWDOWN, 'Chowdown'),
|
||||
(SAFFRON, 'Saffron'), (CHEFTAP, 'ChefTap'), (PEPPERPLATE, 'Pepperplate'), (RECETTETEK, 'RecetteTek'), (RECIPESAGE, 'Recipe Sage'),
|
||||
(DOMESTICA, 'Domestica'), (MEALMASTER, 'MealMaster'), (REZKONV, 'RezKonv'), (OPENEATS, 'Openeats'), (RECIPEKEEPER, 'Recipe Keeper'),
|
||||
(PLANTOEAT, 'Plantoeat'), (COOKBOOKAPP, 'CookBookApp'), (COPYMETHAT, 'CopyMeThat'), (PDF, 'PDF'), (MELARECIPES, 'Melarecipes'),
|
||||
(COOKMATE, 'Cookmate'), (REZEPTSUITEDE, 'Recipesuite.de')))
|
||||
(COOKMATE, 'Cookmate'), (REZEPTSUITEDE, 'Recipesuite.de'), (GOURMET, 'Gourmet')))
|
||||
|
||||
|
||||
class MultipleFileInput(forms.ClearableFileInput):
|
||||
@@ -182,6 +183,12 @@ class ConnectorConfigForm(forms.ModelForm):
|
||||
required=False,
|
||||
)
|
||||
|
||||
supports_description_field = forms.BooleanField(
|
||||
help_text="Does the connector todo entity support the description field",
|
||||
initial=True,
|
||||
required=False,
|
||||
)
|
||||
|
||||
update_token = forms.CharField(
|
||||
widget=forms.TextInput(attrs={'autocomplete': 'update-token', 'type': 'password'}),
|
||||
required=False,
|
||||
@@ -198,7 +205,7 @@ class ConnectorConfigForm(forms.ModelForm):
|
||||
|
||||
fields = (
|
||||
'name', 'type', 'enabled', 'on_shopping_list_entry_created_enabled', 'on_shopping_list_entry_updated_enabled',
|
||||
'on_shopping_list_entry_deleted_enabled', 'url', 'todo_entity',
|
||||
'on_shopping_list_entry_deleted_enabled', 'supports_description_field', 'url', 'todo_entity',
|
||||
)
|
||||
|
||||
help_texts = {
|
||||
|
||||
@@ -28,7 +28,9 @@ def get_from_scraper(scrape, request):
|
||||
source_url = scrape.url
|
||||
except Exception:
|
||||
pass
|
||||
if source_url:
|
||||
if source_url == "https://urlnotfound.none" or not source_url:
|
||||
recipe_json['source_url'] = ''
|
||||
else:
|
||||
recipe_json['source_url'] = source_url
|
||||
try:
|
||||
keywords.append(source_url.replace('http://', '').replace('https://', '').split('/')[0])
|
||||
|
||||
211
cookbook/integration/gourmet.py
Normal file
211
cookbook/integration/gourmet.py
Normal file
@@ -0,0 +1,211 @@
|
||||
import base64
|
||||
from io import BytesIO
|
||||
from lxml import etree
|
||||
import requests
|
||||
from pathlib import Path
|
||||
|
||||
from bs4 import BeautifulSoup, Tag
|
||||
|
||||
from cookbook.helper.HelperFunctions import validate_import_url
|
||||
from cookbook.helper.ingredient_parser import IngredientParser
|
||||
from cookbook.helper.recipe_url_import import parse_servings, parse_servings_text, parse_time, iso_duration_to_minutes
|
||||
from cookbook.integration.integration import Integration
|
||||
from cookbook.models import Ingredient, Recipe, Step, Keyword
|
||||
from recipe_scrapers import scrape_html
|
||||
|
||||
|
||||
class Gourmet(Integration):
|
||||
|
||||
def split_recipe_file(self, file):
|
||||
encoding = 'utf-8'
|
||||
byte_string = file.read()
|
||||
text_obj = byte_string.decode(encoding, errors="ignore")
|
||||
soup = BeautifulSoup(text_obj, "html.parser")
|
||||
return soup.find_all("div", {"class": "recipe"})
|
||||
|
||||
def get_ingredients_recursive(self, step, ingredients, ingredient_parser):
|
||||
if isinstance(ingredients, Tag):
|
||||
for ingredient in ingredients.children:
|
||||
if not isinstance(ingredient, Tag):
|
||||
continue
|
||||
|
||||
if ingredient.name in ["li"]:
|
||||
step_name = "".join(ingredient.findAll(text=True, recursive=False)).strip().rstrip(":")
|
||||
|
||||
step.ingredients.add(Ingredient.objects.create(
|
||||
is_header=True,
|
||||
note=step_name[:256],
|
||||
original_text=step_name,
|
||||
space=self.request.space,
|
||||
))
|
||||
next_ingrediets = ingredient.find("ul", {"class": "ing"})
|
||||
self.get_ingredients_recursive(step, next_ingrediets, ingredient_parser)
|
||||
|
||||
else:
|
||||
try:
|
||||
amount, unit, food, note = ingredient_parser.parse(ingredient.text.strip())
|
||||
f = ingredient_parser.get_food(food)
|
||||
u = ingredient_parser.get_unit(unit)
|
||||
step.ingredients.add(
|
||||
Ingredient.objects.create(
|
||||
food=f,
|
||||
unit=u,
|
||||
amount=amount,
|
||||
note=note,
|
||||
original_text=ingredient.text.strip(),
|
||||
space=self.request.space,
|
||||
)
|
||||
)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
def get_recipe_from_file(self, file):
|
||||
# 'file' comes is as a beautifulsoup object
|
||||
|
||||
source_url = None
|
||||
for item in file.find_all('a'):
|
||||
if item.has_attr('href'):
|
||||
source_url = item.get("href")
|
||||
break
|
||||
|
||||
name = file.find("p", {"class": "title"}).find("span", {"itemprop": "name"}).text.strip()
|
||||
|
||||
recipe = Recipe.objects.create(
|
||||
name=name[:128],
|
||||
source_url=source_url,
|
||||
created_by=self.request.user,
|
||||
internal=True,
|
||||
space=self.request.space,
|
||||
)
|
||||
|
||||
for category in file.find_all("span", {"itemprop": "recipeCategory"}):
|
||||
keyword, created = Keyword.objects.get_or_create(name=category.text, space=self.request.space)
|
||||
recipe.keywords.add(keyword)
|
||||
|
||||
try:
|
||||
recipe.servings = parse_servings(file.find("span", {"itemprop": "recipeYield"}).text.strip())
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
try:
|
||||
prep_time = file.find("span", {"itemprop": "prepTime"}).text.strip().split()
|
||||
prep_time[0] = prep_time[0].replace(',', '.')
|
||||
if prep_time[1].lower() in ['stunde', 'stunden', 'hour', 'hours']:
|
||||
prep_time_min = int(float(prep_time[0]) * 60)
|
||||
elif prep_time[1].lower() in ['tag', 'tage', 'day', 'days']:
|
||||
prep_time_min = int(float(prep_time[0]) * 60 * 24)
|
||||
else:
|
||||
prep_time_min = int(prep_time[0])
|
||||
recipe.waiting_time = prep_time_min
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
try:
|
||||
cook_time = file.find("span", {"itemprop": "cookTime"}).text.strip().split()
|
||||
cook_time[0] = cook_time[0].replace(',', '.')
|
||||
if cook_time[1].lower() in ['stunde', 'stunden', 'hour', 'hours']:
|
||||
cook_time_min = int(float(cook_time[0]) * 60)
|
||||
elif cook_time[1].lower() in ['tag', 'tage', 'day', 'days']:
|
||||
cook_time_min = int(float(cook_time[0]) * 60 * 24)
|
||||
else:
|
||||
cook_time_min = int(cook_time[0])
|
||||
|
||||
recipe.working_time = cook_time_min
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
for cuisine in file.find_all('span', {'itemprop': 'recipeCuisine'}):
|
||||
cuisine_name = cuisine.text
|
||||
keyword = Keyword.objects.get_or_create(space=self.request.space, name=cuisine_name)
|
||||
if len(keyword):
|
||||
recipe.keywords.add(keyword[0])
|
||||
|
||||
for category in file.find_all('span', {'itemprop': 'recipeCategory'}):
|
||||
category_name = category.text
|
||||
keyword = Keyword.objects.get_or_create(space=self.request.space, name=category_name)
|
||||
if len(keyword):
|
||||
recipe.keywords.add(keyword[0])
|
||||
|
||||
step = Step.objects.create(
|
||||
instruction='',
|
||||
space=self.request.space,
|
||||
show_ingredients_table=self.request.user.userpreference.show_step_ingredients,
|
||||
)
|
||||
|
||||
ingredient_parser = IngredientParser(self.request, True)
|
||||
|
||||
ingredients = file.find("ul", {"class": "ing"})
|
||||
self.get_ingredients_recursive(step, ingredients, ingredient_parser)
|
||||
|
||||
instructions = file.find("div", {"class": "instructions"})
|
||||
if isinstance(instructions, Tag):
|
||||
for instruction in instructions.children:
|
||||
if not isinstance(instruction, Tag) or instruction.text == "":
|
||||
continue
|
||||
if instruction.name == "h3":
|
||||
if step.instruction:
|
||||
step.save()
|
||||
recipe.steps.add(step)
|
||||
step = Step.objects.create(
|
||||
instruction='',
|
||||
space=self.request.space,
|
||||
)
|
||||
|
||||
step.name = instruction.text.strip()[:128]
|
||||
else:
|
||||
if instruction.name == "div":
|
||||
for instruction_step in instruction.children:
|
||||
for br in instruction_step.find_all("br"):
|
||||
br.replace_with("\n")
|
||||
step.instruction += instruction_step.text.strip() + ' \n\n'
|
||||
|
||||
notes = file.find("div", {"class": "modifications"})
|
||||
if notes:
|
||||
for n in notes.children:
|
||||
if n.text == "":
|
||||
continue
|
||||
if n.name == "h3":
|
||||
step.instruction += f'*{n.text.strip()}:* \n\n'
|
||||
else:
|
||||
for br in n.find_all("br"):
|
||||
br.replace_with("\n")
|
||||
|
||||
step.instruction += '*' + n.text.strip() + '* \n\n'
|
||||
|
||||
description = ''
|
||||
try:
|
||||
description = file.find("div", {"id": "description"}).text.strip()
|
||||
except AttributeError:
|
||||
pass
|
||||
if len(description) <= 512:
|
||||
recipe.description = description
|
||||
else:
|
||||
recipe.description = description[:480] + ' ... (full description below)'
|
||||
step.instruction += '*Description:* \n\n*' + description + '* \n\n'
|
||||
|
||||
step.save()
|
||||
recipe.steps.add(step)
|
||||
|
||||
# import the Primary recipe image that is stored in the Zip
|
||||
try:
|
||||
image_path = file.find("img").get("src")
|
||||
image_filename = image_path.split("\\")[1]
|
||||
|
||||
for f in self.import_zip.filelist:
|
||||
zip_file_name = Path(f.filename).name
|
||||
if image_filename == zip_file_name:
|
||||
image_file = self.import_zip.read(f)
|
||||
image_bytes = BytesIO(image_file)
|
||||
self.import_recipe_image(recipe, image_bytes, filetype='.jpeg')
|
||||
break
|
||||
except Exception as e:
|
||||
print(recipe.name, ': failed to import image ', str(e))
|
||||
|
||||
recipe.save()
|
||||
return recipe
|
||||
|
||||
def get_files_from_recipes(self, recipes, el, cookie):
|
||||
raise NotImplementedError('Method not implemented in storage integration')
|
||||
|
||||
def get_file_from_recipe(self, recipe):
|
||||
raise NotImplementedError('Method not implemented in storage integration')
|
||||
@@ -153,6 +153,19 @@ class Integration:
|
||||
il.total_recipes = len(new_file_list)
|
||||
file_list = new_file_list
|
||||
|
||||
if isinstance(self, cookbook.integration.gourmet.Gourmet):
|
||||
self.import_zip = import_zip
|
||||
new_file_list = []
|
||||
for file in file_list:
|
||||
if file.file_size == 0:
|
||||
next
|
||||
if file.filename.startswith("index.htm"):
|
||||
next
|
||||
if file.filename.endswith(".htm"):
|
||||
new_file_list += self.split_recipe_file(BytesIO(import_zip.read(file.filename)))
|
||||
il.total_recipes = len(new_file_list)
|
||||
file_list = new_file_list
|
||||
|
||||
for z in file_list:
|
||||
try:
|
||||
if not hasattr(z, 'filename') or isinstance(z, Tag):
|
||||
|
||||
@@ -72,14 +72,14 @@ class Mealie(Integration):
|
||||
)
|
||||
recipe.steps.add(step)
|
||||
|
||||
if 'recipe_yield' in recipe_json:
|
||||
if 'recipe_yield' in recipe_json and recipe_json['recipe_yield'] is not None:
|
||||
recipe.servings = parse_servings(recipe_json['recipe_yield'])
|
||||
recipe.servings_text = parse_servings_text(recipe_json['recipe_yield'])
|
||||
|
||||
if 'total_time' in recipe_json and recipe_json['total_time'] is not None:
|
||||
recipe.working_time = parse_time(recipe_json['total_time'])
|
||||
|
||||
if 'org_url' in recipe_json:
|
||||
if 'org_url' in recipe_json and recipe_json['org_url'] is not None:
|
||||
recipe.source_url = recipe_json['org_url']
|
||||
|
||||
recipe.save()
|
||||
|
||||
@@ -84,6 +84,11 @@ class Paprika(Integration):
|
||||
|
||||
recipe.steps.add(step)
|
||||
|
||||
# Paprika exports can have images in either of image_url, or photo_data.
|
||||
# If a user takes an image himself, only photo_data will be set.
|
||||
# If a user imports an image, both will be set. But the photo_data will be a center-cropped square resized version, so the image_url is preferred.
|
||||
|
||||
# Try to download image if possible
|
||||
try:
|
||||
if recipe_json.get("image_url", None):
|
||||
url = recipe_json.get("image_url", None)
|
||||
@@ -91,6 +96,10 @@ class Paprika(Integration):
|
||||
response = requests.get(url)
|
||||
self.import_recipe_image(recipe, BytesIO(response.content))
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# If no image downloaded, try to extract from photo_data
|
||||
if not recipe.image:
|
||||
if recipe_json.get("photo_data", None):
|
||||
self.import_recipe_image(recipe, BytesIO(base64.b64decode(recipe_json['photo_data'])), filetype='.jpeg')
|
||||
|
||||
|
||||
@@ -15,10 +15,10 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
|
||||
"PO-Revision-Date: 2024-07-31 13:05+0000\n"
|
||||
"Last-Translator: vabene1111 <vabene1234@googlemail.com>\n"
|
||||
"Language-Team: German <http://translate.tandoor.dev/projects/tandoor/recipes-"
|
||||
"backend/de/>\n"
|
||||
"PO-Revision-Date: 2024-09-27 13:58+0000\n"
|
||||
"Last-Translator: supaeasy <crafty_renewably854@supaeasy.de>\n"
|
||||
"Language-Team: German <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/de/>\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -478,7 +478,7 @@ msgstr "Essensplan"
|
||||
#: .\cookbook\models.py:456 .\cookbook\templates\base.html:122
|
||||
#: .\cookbook\views\views.py:459
|
||||
msgid "Books"
|
||||
msgstr "Bücher"
|
||||
msgstr "Kochbücher"
|
||||
|
||||
#: .\cookbook\models.py:457 .\cookbook\templates\base.html:118
|
||||
#: .\cookbook\views\views.py:460
|
||||
@@ -542,10 +542,8 @@ msgid "Instruction Replace"
|
||||
msgstr "Anleitung ersetzen"
|
||||
|
||||
#: .\cookbook\models.py:1472
|
||||
#, fuzzy
|
||||
#| msgid "New Unit"
|
||||
msgid "Never Unit"
|
||||
msgstr "Neue Einheit"
|
||||
msgstr "Nie Einheit"
|
||||
|
||||
#: .\cookbook\models.py:1473
|
||||
msgid "Transpose Words"
|
||||
@@ -2143,7 +2141,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\system.html:86
|
||||
msgid "Allowed Hosts"
|
||||
msgstr ""
|
||||
msgstr "Erlaubte Hosts"
|
||||
|
||||
#: .\cookbook\templates\system.html:90
|
||||
msgid ""
|
||||
@@ -2153,6 +2151,11 @@ msgid ""
|
||||
"this.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Die erlaubten Hosts sind so konfiguriert, dass sie jeden Host "
|
||||
"erlauben. Das mag in einigen Fällen in Ordnung sein, sollte aber im "
|
||||
"Regelfall vermieden werden. Bitte lies in der Dokumentation dazu nach.\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\system.html:97
|
||||
msgid "Database"
|
||||
@@ -2504,16 +2507,12 @@ msgid "Filter for entries with the given recipe"
|
||||
msgstr "Filter für Einträge mit dem angegebenen Rezept"
|
||||
|
||||
#: .\cookbook\views\api.py:1292
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "Returns the shopping list entry with a primary key of id. Multiple "
|
||||
#| "values allowed."
|
||||
msgid ""
|
||||
"Return the Automations matching the automation type. Multiple values "
|
||||
"allowed."
|
||||
msgstr ""
|
||||
"Zeigt denjenigen Eintrag auf der Einkaufliste mit der angegebenen ID. Kann "
|
||||
"mehrfach angegeben werden."
|
||||
"Zeigt Automationen, die dem Automationstyp entsprechen. Kann mehrfach "
|
||||
"angegeben werden."
|
||||
|
||||
#: .\cookbook\views\api.py:1415
|
||||
msgid "Nothing to do."
|
||||
@@ -2582,10 +2581,8 @@ msgstr ""
|
||||
"Monitor verwendet wird."
|
||||
|
||||
#: .\cookbook\views\delete.py:135
|
||||
#, fuzzy
|
||||
#| msgid "Storage Backend"
|
||||
msgid "Connectors Config Backend"
|
||||
msgstr "Speicherquelle"
|
||||
msgstr "Backendkonfiguration für Konnektoren"
|
||||
|
||||
#: .\cookbook\views\delete.py:157
|
||||
msgid "Invite Link"
|
||||
@@ -2644,10 +2641,8 @@ msgid "Shopping List"
|
||||
msgstr "Einkaufsliste"
|
||||
|
||||
#: .\cookbook\views\lists.py:77 .\cookbook\views\new.py:98
|
||||
#, fuzzy
|
||||
#| msgid "Storage Backend"
|
||||
msgid "Connector Config Backend"
|
||||
msgstr "Speicherquelle"
|
||||
msgstr "Backendkonfiguration für Konnektoren"
|
||||
|
||||
#: .\cookbook\views\lists.py:91
|
||||
msgid "Invite Links"
|
||||
@@ -2743,7 +2738,7 @@ msgstr "Sie verwenden PostgreSQL %(v1)s. PostgreSQL %(v2)s wird empfohlen"
|
||||
|
||||
#: .\cookbook\views\views.py:313
|
||||
msgid "Unable to determine PostgreSQL version."
|
||||
msgstr ""
|
||||
msgstr "PostgreSQL version konnte nicht erkannt werden."
|
||||
|
||||
#: .\cookbook\views\views.py:317
|
||||
msgid ""
|
||||
@@ -2755,18 +2750,14 @@ msgstr ""
|
||||
"PostgreSQL-Datenbanken funktionieren."
|
||||
|
||||
#: .\cookbook\views\views.py:360
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "The setup page can only be used to create the first user! If you have "
|
||||
#| "forgotten your superuser credentials please consult the django "
|
||||
#| "documentation on how to reset passwords."
|
||||
msgid ""
|
||||
"The setup page can only be used to create the first "
|
||||
"user! If you have forgotten your superuser credentials "
|
||||
"please consult the django documentation on how to reset passwords."
|
||||
msgstr ""
|
||||
"Die Setup-Seite kann nur für den ersten Nutzer verwendet werden. Zum "
|
||||
"Zurücksetzen von Passwörtern bitte der Django-Dokumentation folgen."
|
||||
"Die Setup-Seite kann nur für den ersten Nutzer verwendet "
|
||||
"werden. Falls du die Superuser Logindaten vergessen "
|
||||
"hast, folge bitte der Django-Dokumentation um Passwörter zurückzusetzen."
|
||||
|
||||
#: .\cookbook\views\views.py:369
|
||||
msgid "Passwords dont match!"
|
||||
|
||||
@@ -8,16 +8,16 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
|
||||
"PO-Revision-Date: 2023-08-21 09:19+0000\n"
|
||||
"Last-Translator: Theodoros Grammenos <teogramm@outlook.com>\n"
|
||||
"Language-Team: Greek <http://translate.tandoor.dev/projects/tandoor/recipes-"
|
||||
"backend/el/>\n"
|
||||
"PO-Revision-Date: 2024-09-23 21:58+0000\n"
|
||||
"Last-Translator: Emmker <emmker@gmail.com>\n"
|
||||
"Language-Team: Greek <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/el/>\n"
|
||||
"Language: el\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.15\n"
|
||||
"X-Generator: Weblate 5.6.2\n"
|
||||
|
||||
#: .\cookbook\forms.py:45
|
||||
msgid ""
|
||||
@@ -33,7 +33,7 @@ msgstr "Όνομα"
|
||||
|
||||
#: .\cookbook\forms.py:62 .\cookbook\forms.py:246 .\cookbook\views\lists.py:103
|
||||
msgid "Keywords"
|
||||
msgstr "Λέξεις κλειδιά"
|
||||
msgstr "Λέξεις Κλειδιά"
|
||||
|
||||
#: .\cookbook\forms.py:62
|
||||
msgid "Preparation time in minutes"
|
||||
@@ -98,7 +98,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\forms.py:205
|
||||
msgid "http://homeassistant.local:8123/api for example"
|
||||
msgstr ""
|
||||
msgstr "http://homeassistant.local:8123/api για παράδειγμα"
|
||||
|
||||
#: .\cookbook\forms.py:222 .\cookbook\views\edit.py:117
|
||||
msgid "Storage"
|
||||
|
||||
@@ -8,17 +8,17 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
|
||||
"PO-Revision-Date: 2024-07-28 08:38+0000\n"
|
||||
"Last-Translator: dudu dor <dudpon@gmail.com>\n"
|
||||
"Language-Team: Hebrew <http://translate.tandoor.dev/projects/tandoor/recipes-"
|
||||
"backend/he/>\n"
|
||||
"PO-Revision-Date: 2024-09-08 12:58+0000\n"
|
||||
"Last-Translator: Tomer Alcavi <alcavi1991@gmail.com>\n"
|
||||
"Language-Team: Hebrew <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/he/>\n"
|
||||
"Language: he\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && "
|
||||
"n % 10 == 0) ? 2 : 3));\n"
|
||||
"X-Generator: Weblate 5.4.2\n"
|
||||
"X-Generator: Weblate 5.6.2\n"
|
||||
|
||||
#: .\cookbook\forms.py:45
|
||||
msgid ""
|
||||
@@ -62,15 +62,15 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\forms.py:143
|
||||
msgid "Add your comment: "
|
||||
msgstr "הוף את ההערות שלך:- "
|
||||
msgstr "הוסף את ההערה שלך::- "
|
||||
|
||||
#: .\cookbook\forms.py:151
|
||||
msgid "Leave empty for dropbox and enter app password for nextcloud."
|
||||
msgstr "השאר ריק עבור dropbox והכנס סיסמאת יישום עבור nextcloud."
|
||||
msgstr "השאר ריק עבור Dropbox והכנס סיסמא עבור NextCloud."
|
||||
|
||||
#: .\cookbook\forms.py:154
|
||||
msgid "Leave empty for nextcloud and enter api token for dropbox."
|
||||
msgstr "השאר ריק עבור nextcloud והכנס טוקן API עבור dropbox."
|
||||
msgstr "השאר ריק עבור NextCloud והכנס טוקן API עבור Dropbox."
|
||||
|
||||
#: .\cookbook\forms.py:160
|
||||
msgid ""
|
||||
@@ -149,6 +149,7 @@ msgid ""
|
||||
"Use fuzzy matching on units, keywords and ingredients when editing and "
|
||||
"importing recipes."
|
||||
msgstr ""
|
||||
"השתמש בהתאמה גמישה ליחידות, מילות מפתח ורכיבים בעת עריכה וייבוא מתכונים."
|
||||
|
||||
#: .\cookbook\forms.py:342
|
||||
msgid ""
|
||||
@@ -237,7 +238,7 @@ msgstr ""
|
||||
#: .\cookbook\helper\permission_helper.py:237
|
||||
#: .\cookbook\helper\permission_helper.py:252
|
||||
msgid "You cannot interact with this object as it is not owned by you!"
|
||||
msgstr ""
|
||||
msgstr "אינך יכול/ה לפעול על אובייקט זה כיוון שהוא לא בבעלותך!"
|
||||
|
||||
#: .\cookbook\helper\permission_helper.py:402
|
||||
msgid "You have reached the maximum number of recipes for your space."
|
||||
@@ -441,7 +442,7 @@ msgstr ""
|
||||
#: .\cookbook\models.py:457 .\cookbook\templates\base.html:118
|
||||
#: .\cookbook\views\views.py:460
|
||||
msgid "Shopping"
|
||||
msgstr ""
|
||||
msgstr "קניות"
|
||||
|
||||
#: .\cookbook\models.py:752
|
||||
msgid " is part of a recipe step and cannot be deleted"
|
||||
@@ -526,7 +527,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\models.py:1504
|
||||
msgid "Food"
|
||||
msgstr ""
|
||||
msgstr "אוכל"
|
||||
|
||||
#: .\cookbook\models.py:1505 .\cookbook\templates\base.html:149
|
||||
msgid "Keyword"
|
||||
@@ -546,7 +547,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\serializer.py:1270
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
msgstr "שלום"
|
||||
|
||||
#: .\cookbook\serializer.py:1270
|
||||
msgid "You have been invited by "
|
||||
@@ -567,12 +568,12 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\serializer.py:1278
|
||||
msgid "The invitation is valid until "
|
||||
msgstr ""
|
||||
msgstr "ההזמנה תקפה עד "
|
||||
|
||||
#: .\cookbook\serializer.py:1280
|
||||
msgid ""
|
||||
"Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub "
|
||||
msgstr ""
|
||||
msgstr "Tandoor Recipes הוא מנהל מתכונים בקוד פתוח. ניתן למצוא אותנו ב-GitHub. "
|
||||
|
||||
#: .\cookbook\serializer.py:1283
|
||||
msgid "Tandoor Recipes Invite"
|
||||
@@ -610,11 +611,11 @@ msgstr ""
|
||||
#: .\cookbook\templates\generic\delete_template.html:15
|
||||
#: .\cookbook\templates\generic\edit_template.html:28
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
msgstr "מחיקה"
|
||||
|
||||
#: .\cookbook\templates\404.html:5
|
||||
msgid "404 Error"
|
||||
msgstr ""
|
||||
msgstr "שגיאה 404"
|
||||
|
||||
#: .\cookbook\templates\404.html:18
|
||||
msgid "The page you are looking for could not be found."
|
||||
@@ -626,12 +627,12 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\404.html:35
|
||||
msgid "Report a Bug"
|
||||
msgstr ""
|
||||
msgstr "דווח על באג"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:6
|
||||
#: .\cookbook\templates\account\email.html:17
|
||||
msgid "E-mail Addresses"
|
||||
msgstr ""
|
||||
msgstr "כתובות אימייל"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:12
|
||||
#: .\cookbook\templates\account\password_change.html:11
|
||||
@@ -641,11 +642,11 @@ msgstr ""
|
||||
#: .\cookbook\templates\socialaccount\connections.html:10
|
||||
#: .\cookbook\templates\user_settings.html:8
|
||||
msgid "Settings"
|
||||
msgstr ""
|
||||
msgstr "הגדרות"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:13
|
||||
msgid "Email"
|
||||
msgstr ""
|
||||
msgstr "מייל"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:19
|
||||
msgid "The following e-mail addresses are associated with your account:"
|
||||
@@ -653,33 +654,33 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\account\email.html:36
|
||||
msgid "Verified"
|
||||
msgstr ""
|
||||
msgstr "מאומת"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:38
|
||||
msgid "Unverified"
|
||||
msgstr ""
|
||||
msgstr "לא מאומת"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:40
|
||||
msgid "Primary"
|
||||
msgstr ""
|
||||
msgstr "ראשי"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:47
|
||||
msgid "Make Primary"
|
||||
msgstr ""
|
||||
msgstr "הגדר כראשי"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:49
|
||||
msgid "Re-send Verification"
|
||||
msgstr ""
|
||||
msgstr "שלח אימות מחדש"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:50
|
||||
#: .\cookbook\templates\generic\delete_template.html:57
|
||||
#: .\cookbook\templates\socialaccount\connections.html:44
|
||||
msgid "Remove"
|
||||
msgstr ""
|
||||
msgstr "הסרה"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:58
|
||||
msgid "Warning:"
|
||||
msgstr ""
|
||||
msgstr "אזהרה:"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:58
|
||||
msgid ""
|
||||
@@ -689,11 +690,11 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\account\email.html:64
|
||||
msgid "Add E-mail Address"
|
||||
msgstr ""
|
||||
msgstr "הוספת כתובת מייל"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:69
|
||||
msgid "Add E-mail"
|
||||
msgstr ""
|
||||
msgstr "הוספת מייל"
|
||||
|
||||
#: .\cookbook\templates\account\email.html:79
|
||||
msgid "Do you really want to remove the selected e-mail address?"
|
||||
@@ -702,7 +703,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\account\email_confirm.html:6
|
||||
#: .\cookbook\templates\account\email_confirm.html:10
|
||||
msgid "Confirm E-mail Address"
|
||||
msgstr ""
|
||||
msgstr "אשר כתובת מייל"
|
||||
|
||||
#: .\cookbook\templates\account\email_confirm.html:16
|
||||
#, python-format
|
||||
@@ -716,7 +717,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\account\email_confirm.html:22
|
||||
#: .\cookbook\templates\generic\delete_template.html:72
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
msgstr "אשר"
|
||||
|
||||
#: .\cookbook\templates\account\email_confirm.html:29
|
||||
#, python-format
|
||||
@@ -729,7 +730,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\account\login.html:8 .\cookbook\templates\base.html:388
|
||||
#: .\cookbook\templates\openid\login.html:8
|
||||
msgid "Login"
|
||||
msgstr ""
|
||||
msgstr "התחבר"
|
||||
|
||||
#: .\cookbook\templates\account\login.html:15
|
||||
#: .\cookbook\templates\account\login.html:31
|
||||
@@ -741,7 +742,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\openid\login.html:26
|
||||
#: .\cookbook\templates\socialaccount\authentication_error.html:15
|
||||
msgid "Sign In"
|
||||
msgstr ""
|
||||
msgstr "התחבר"
|
||||
|
||||
#: .\cookbook\templates\account\login.html:34
|
||||
#: .\cookbook\templates\account\password_reset.html:41
|
||||
@@ -749,7 +750,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\socialaccount\signup.html:8
|
||||
#: .\cookbook\templates\socialaccount\signup.html:57
|
||||
msgid "Sign Up"
|
||||
msgstr ""
|
||||
msgstr "הירשם"
|
||||
|
||||
#: .\cookbook\templates\account\login.html:38
|
||||
msgid "Lost your password?"
|
||||
@@ -758,7 +759,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\account\login.html:39
|
||||
#: .\cookbook\templates\account\password_reset.html:29
|
||||
msgid "Reset My Password"
|
||||
msgstr ""
|
||||
msgstr "איפוס סיסמא"
|
||||
|
||||
#: .\cookbook\templates\account\login.html:50
|
||||
msgid "Social Login"
|
||||
@@ -772,7 +773,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\account\logout.html:9
|
||||
#: .\cookbook\templates\account\logout.html:18
|
||||
msgid "Sign Out"
|
||||
msgstr ""
|
||||
msgstr "התנתק"
|
||||
|
||||
#: .\cookbook\templates\account\logout.html:11
|
||||
msgid "Are you sure you want to sign out?"
|
||||
@@ -791,7 +792,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\account\password_change.html:12
|
||||
#: .\cookbook\templates\account\password_set.html:12
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
msgstr "סיסמא"
|
||||
|
||||
#: .\cookbook\templates\account\password_change.html:22
|
||||
msgid "Forgot Password?"
|
||||
@@ -846,52 +847,52 @@ msgstr ""
|
||||
#: .\cookbook\templates\account\password_set.html:16
|
||||
#: .\cookbook\templates\account\password_set.html:21
|
||||
msgid "Set Password"
|
||||
msgstr ""
|
||||
msgstr "קבע סיסמא"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:6
|
||||
msgid "Register"
|
||||
msgstr ""
|
||||
msgstr "הירשם"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:12
|
||||
msgid "Create an Account"
|
||||
msgstr ""
|
||||
msgstr "צור משתמש"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:42
|
||||
#: .\cookbook\templates\socialaccount\signup.html:33
|
||||
msgid "I accept the follwoing"
|
||||
msgstr ""
|
||||
msgstr "אני מקבל את התנאים הבאים"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:45
|
||||
#: .\cookbook\templates\socialaccount\signup.html:36
|
||||
msgid "Terms and Conditions"
|
||||
msgstr ""
|
||||
msgstr "תנאים והגבלות"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:48
|
||||
#: .\cookbook\templates\socialaccount\signup.html:39
|
||||
msgid "and"
|
||||
msgstr ""
|
||||
msgstr "ו"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:52
|
||||
#: .\cookbook\templates\socialaccount\signup.html:43
|
||||
msgid "Privacy Policy"
|
||||
msgstr ""
|
||||
msgstr "מדיניות פרטיות"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:65
|
||||
msgid "Create User"
|
||||
msgstr ""
|
||||
msgstr "צור משתמש"
|
||||
|
||||
#: .\cookbook\templates\account\signup.html:69
|
||||
msgid "Already have an account?"
|
||||
msgstr ""
|
||||
msgstr "יש לך חשבון?"
|
||||
|
||||
#: .\cookbook\templates\account\signup_closed.html:5
|
||||
#: .\cookbook\templates\account\signup_closed.html:11
|
||||
msgid "Sign Up Closed"
|
||||
msgstr ""
|
||||
msgstr "ההרשמה סגורה"
|
||||
|
||||
#: .\cookbook\templates\account\signup_closed.html:13
|
||||
msgid "We are sorry, but the sign up is currently closed."
|
||||
msgstr ""
|
||||
msgstr "אנו מצטערים, אך ההרשמה כרגע סגורה."
|
||||
|
||||
#: .\cookbook\templates\api_info.html:5 .\cookbook\templates\base.html:378
|
||||
#: .\cookbook\templates\rest_framework\api.html:11
|
||||
@@ -900,11 +901,11 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\base.html:110 .\cookbook\templates\index.html:87
|
||||
msgid "Recipes"
|
||||
msgstr ""
|
||||
msgstr "מתכונים"
|
||||
|
||||
#: .\cookbook\templates\base.html:161 .\cookbook\views\lists.py:120
|
||||
msgid "Foods"
|
||||
msgstr ""
|
||||
msgstr "מאכלים"
|
||||
|
||||
#: .\cookbook\templates\base.html:173 .\cookbook\views\lists.py:137
|
||||
msgid "Units"
|
||||
@@ -920,11 +921,11 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\base.html:211 .\cookbook\views\lists.py:186
|
||||
msgid "Automations"
|
||||
msgstr ""
|
||||
msgstr "אוטומציות"
|
||||
|
||||
#: .\cookbook\templates\base.html:225 .\cookbook\views\lists.py:222
|
||||
msgid "Files"
|
||||
msgstr ""
|
||||
msgstr "קבצים"
|
||||
|
||||
#: .\cookbook\templates\base.html:237
|
||||
msgid "Batch Edit"
|
||||
@@ -945,7 +946,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\export_response.html:7
|
||||
#: .\cookbook\templates\test2.html:14 .\cookbook\templates\test2.html:20
|
||||
msgid "Export"
|
||||
msgstr ""
|
||||
msgstr "יצא"
|
||||
|
||||
#: .\cookbook\templates\base.html:287
|
||||
msgid "Properties"
|
||||
@@ -970,7 +971,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\base.html:336 .\cookbook\templates\space_manage.html:15
|
||||
msgid "Space Settings"
|
||||
msgstr ""
|
||||
msgstr "הגדרות מרחב"
|
||||
|
||||
#: .\cookbook\templates\base.html:340
|
||||
msgid "External Connectors"
|
||||
@@ -978,21 +979,21 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\base.html:345 .\cookbook\templates\system.html:13
|
||||
msgid "System"
|
||||
msgstr ""
|
||||
msgstr "מערכת"
|
||||
|
||||
#: .\cookbook\templates\base.html:347
|
||||
msgid "Admin"
|
||||
msgstr ""
|
||||
msgstr "מנהל"
|
||||
|
||||
#: .\cookbook\templates\base.html:351
|
||||
#: .\cookbook\templates\space_overview.html:25
|
||||
msgid "Your Spaces"
|
||||
msgstr ""
|
||||
msgstr "המרחבים שלך"
|
||||
|
||||
#: .\cookbook\templates\base.html:362
|
||||
#: .\cookbook\templates\space_overview.html:6
|
||||
msgid "Overview"
|
||||
msgstr ""
|
||||
msgstr "סקירה כללית"
|
||||
|
||||
#: .\cookbook\templates\base.html:372
|
||||
msgid "Markdown Guide"
|
||||
@@ -1012,7 +1013,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\base.html:383
|
||||
msgid "Log out"
|
||||
msgstr ""
|
||||
msgstr "התנתק"
|
||||
|
||||
#: .\cookbook\templates\base.html:406
|
||||
msgid "You are using the free version of Tandor"
|
||||
@@ -1070,7 +1071,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\batch\monitor.html:29
|
||||
msgid "Show Recipes"
|
||||
msgstr ""
|
||||
msgstr "הראה מתכונים"
|
||||
|
||||
#: .\cookbook\templates\batch\monitor.html:30
|
||||
msgid "Show Log"
|
||||
@@ -1111,7 +1112,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\generic\delete_template.html:22
|
||||
msgid "This cannot be undone!"
|
||||
msgstr ""
|
||||
msgstr "לא ניתן לבטל פעולה זו!"
|
||||
|
||||
#: .\cookbook\templates\generic\delete_template.html:27
|
||||
msgid "Protected"
|
||||
@@ -1128,7 +1129,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\generic\edit_template.html:6
|
||||
#: .\cookbook\templates\generic\edit_template.html:14
|
||||
msgid "Edit"
|
||||
msgstr ""
|
||||
msgstr "ערוך"
|
||||
|
||||
#: .\cookbook\templates\generic\edit_template.html:32
|
||||
msgid "View"
|
||||
@@ -1162,7 +1163,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\generic\table_template.html:98
|
||||
msgid "next"
|
||||
msgstr ""
|
||||
msgstr "הבא"
|
||||
|
||||
#: .\cookbook\templates\history.html:20
|
||||
msgid "View Log"
|
||||
@@ -1175,7 +1176,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\import_response.html:7 .\cookbook\views\delete.py:90
|
||||
#: .\cookbook\views\edit.py:174
|
||||
msgid "Import"
|
||||
msgstr ""
|
||||
msgstr "יבא"
|
||||
|
||||
#: .\cookbook\templates\include\storage_backend_warning.html:4
|
||||
msgid "Security Warning"
|
||||
@@ -1356,7 +1357,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\no_groups_info.html:5
|
||||
#: .\cookbook\templates\no_groups_info.html:12
|
||||
msgid "No Permissions"
|
||||
msgstr ""
|
||||
msgstr "אין הרשאות"
|
||||
|
||||
#: .\cookbook\templates\no_groups_info.html:17
|
||||
msgid "You do not have any groups and therefor cannot use this application."
|
||||
@@ -1365,12 +1366,12 @@ msgstr ""
|
||||
#: .\cookbook\templates\no_groups_info.html:18
|
||||
#: .\cookbook\templates\no_perm_info.html:15
|
||||
msgid "Please contact your administrator."
|
||||
msgstr ""
|
||||
msgstr "אנא פנה למנהל המערכת."
|
||||
|
||||
#: .\cookbook\templates\no_perm_info.html:5
|
||||
#: .\cookbook\templates\no_perm_info.html:12
|
||||
msgid "No Permission"
|
||||
msgstr ""
|
||||
msgstr "אין הרשאות"
|
||||
|
||||
#: .\cookbook\templates\no_perm_info.html:15
|
||||
msgid ""
|
||||
@@ -1380,11 +1381,11 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\offline.html:6
|
||||
msgid "Offline"
|
||||
msgstr ""
|
||||
msgstr "לא מקוון"
|
||||
|
||||
#: .\cookbook\templates\offline.html:19
|
||||
msgid "You are currently offline!"
|
||||
msgstr ""
|
||||
msgstr "אתה כרגע במצב לא מקוון!"
|
||||
|
||||
#: .\cookbook\templates\offline.html:20
|
||||
msgid ""
|
||||
@@ -1395,7 +1396,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\openid\login.html:27
|
||||
#: .\cookbook\templates\socialaccount\authentication_error.html:27
|
||||
msgid "Back"
|
||||
msgstr ""
|
||||
msgstr "אחורה"
|
||||
|
||||
#: .\cookbook\templates\property_editor.html:7
|
||||
msgid "Property Editor"
|
||||
@@ -1422,7 +1423,7 @@ msgstr ""
|
||||
#: .\cookbook\templates\search_info.html:9
|
||||
#: .\cookbook\templates\settings.html:24
|
||||
msgid "Search Settings"
|
||||
msgstr ""
|
||||
msgstr "הגדרות חיפוש"
|
||||
|
||||
#: .\cookbook\templates\search_info.html:10
|
||||
msgid ""
|
||||
@@ -1438,7 +1439,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\search_info.html:19
|
||||
msgid "Search Methods"
|
||||
msgstr ""
|
||||
msgstr "שיטות חיפוש"
|
||||
|
||||
#: .\cookbook\templates\search_info.html:23
|
||||
msgid ""
|
||||
@@ -1521,7 +1522,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\search_info.html:69
|
||||
msgid "Search Fields"
|
||||
msgstr ""
|
||||
msgstr "שדות חיפוש"
|
||||
|
||||
#: .\cookbook\templates\search_info.html:73
|
||||
msgid ""
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -13,16 +13,16 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
|
||||
"PO-Revision-Date: 2024-02-10 12:20+0000\n"
|
||||
"Last-Translator: Jonan B <jonanb@pm.me>\n"
|
||||
"Language-Team: Dutch <http://translate.tandoor.dev/projects/tandoor/recipes-"
|
||||
"backend/nl/>\n"
|
||||
"PO-Revision-Date: 2024-09-03 19:58+0000\n"
|
||||
"Last-Translator: \"S. v.d. Gevel\" <stefan18_gw@hotmail.com>\n"
|
||||
"Language-Team: Dutch <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/nl/>\n"
|
||||
"Language: nl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.15\n"
|
||||
"X-Generator: Weblate 5.6.2\n"
|
||||
|
||||
#: .\cookbook\forms.py:45
|
||||
msgid ""
|
||||
@@ -306,7 +306,7 @@ msgstr "gisten"
|
||||
|
||||
#: .\cookbook\helper\recipe_url_import.py:316
|
||||
msgid "sous-vide"
|
||||
msgstr "sous-vide"
|
||||
msgstr "sous-vide (vacuümgaren)"
|
||||
|
||||
#: .\cookbook\helper\shopping_helper.py:150
|
||||
msgid "You must supply a servings size"
|
||||
@@ -476,7 +476,7 @@ msgstr "Maaltijdplan"
|
||||
#: .\cookbook\models.py:456 .\cookbook\templates\base.html:122
|
||||
#: .\cookbook\views\views.py:459
|
||||
msgid "Books"
|
||||
msgstr "Boeken"
|
||||
msgstr "Kookboeken"
|
||||
|
||||
#: .\cookbook\models.py:457 .\cookbook\templates\base.html:118
|
||||
#: .\cookbook\views\views.py:460
|
||||
@@ -570,7 +570,7 @@ msgstr "Ingrediënt"
|
||||
|
||||
#: .\cookbook\models.py:1505 .\cookbook\templates\base.html:149
|
||||
msgid "Keyword"
|
||||
msgstr "Etiket"
|
||||
msgstr "Trefwoord"
|
||||
|
||||
#: .\cookbook\serializer.py:222
|
||||
msgid "File uploads are not enabled for this Space."
|
||||
@@ -630,8 +630,8 @@ msgid ""
|
||||
"List of ingredient IDs from the recipe to add, if not provided all "
|
||||
"ingredients will be added."
|
||||
msgstr ""
|
||||
"Lijst van ingrediënten ID's van het toe te voegen recept, als deze niet "
|
||||
"opgegeven worden worden alle ingrediënten toegevoegd."
|
||||
"Lijst van ingrediënt ID's van het toe te voegen recept, als deze niet worden "
|
||||
"opgegeven worden alle ingrediënten toegevoegd."
|
||||
|
||||
#: .\cookbook\serializer.py:1430
|
||||
msgid ""
|
||||
@@ -1432,7 +1432,7 @@ msgid ""
|
||||
"rel=\"noreferrer noopener\" target=\"_blank\">this one.</a>"
|
||||
msgstr ""
|
||||
"Het is lastig om met de hand Markdown tabellen te maken. Het wordt "
|
||||
"aangeraden om een tabel editor zoals <a href=\"https://www.tablesgenerator."
|
||||
"aangeraden om een tabel 'editor' zoals <a href=\"https://www.tablesgenerator."
|
||||
"com/markdown_tables\" rel=\"noreferrer noopener\" target=\"_blank\">deze</a> "
|
||||
"te gebruiken."
|
||||
|
||||
@@ -1843,7 +1843,7 @@ msgstr "Perfect voor grote databases"
|
||||
|
||||
#: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5
|
||||
msgid "Cookbook Setup"
|
||||
msgstr "Kookboek Setup"
|
||||
msgstr "Kookboek configuratie"
|
||||
|
||||
#: .\cookbook\templates\setup.html:14
|
||||
msgid "Setup"
|
||||
@@ -2397,24 +2397,30 @@ msgstr "Een waardering van een recept gaat van 0 tot 5."
|
||||
#: .\cookbook\views\api.py:922 .\cookbook\views\api.py:923
|
||||
msgid "ID of book a recipe should be in. For multiple repeat parameter."
|
||||
msgstr ""
|
||||
"ID van boek dat een recept moet hebben. Herhaal parameter voor meerdere."
|
||||
"ID van een kookboek dat een recept moet bevatten. Herhaal parameter voor "
|
||||
"meerdere."
|
||||
|
||||
#: .\cookbook\views\api.py:923 .\cookbook\views\api.py:924
|
||||
msgid "Book IDs, repeat for multiple. Return recipes with any of the books"
|
||||
msgstr "Boek ID, herhaal voor meerdere. Geeft recepten uit alle boeken weer"
|
||||
msgstr ""
|
||||
"Kookboek ID, herhaal voor meerdere. Geeft recepten uit de geselecteerde "
|
||||
"kookboeken weer"
|
||||
|
||||
#: .\cookbook\views\api.py:924 .\cookbook\views\api.py:925
|
||||
msgid "Book IDs, repeat for multiple. Return recipes with all of the books."
|
||||
msgstr "Boek IDs, herhaal voor meerdere. Geeft recepten weer uit alle boeken."
|
||||
msgstr ""
|
||||
"Kookboek IDs, herhaal voor meerdere. Geeft recepten weer uit alle kookboeken."
|
||||
|
||||
#: .\cookbook\views\api.py:925 .\cookbook\views\api.py:926
|
||||
msgid "Book IDs, repeat for multiple. Exclude recipes with any of the books."
|
||||
msgstr ""
|
||||
"Boek IDs, herhaal voor meerdere. Sluit recepten uit elk van de boeken uit."
|
||||
"Kookboek IDs, herhaal voor meerdere. Sluit recepten uit elk van de "
|
||||
"geselecteerde kookboeken uit."
|
||||
|
||||
#: .\cookbook\views\api.py:926 .\cookbook\views\api.py:927
|
||||
msgid "Book IDs, repeat for multiple. Exclude recipes with all of the books."
|
||||
msgstr "Boek IDs, herhaal voor meerdere. Sluit recepten uit alle boeken uit."
|
||||
msgstr ""
|
||||
"Kookboek IDs, herhaal voor meerdere. Sluit recepten uit alle boeken uit."
|
||||
|
||||
#: .\cookbook\views\api.py:927 .\cookbook\views\api.py:928
|
||||
msgid "If only internal recipes should be returned. [true/<b>false</b>]"
|
||||
|
||||
@@ -8,17 +8,17 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
|
||||
"PO-Revision-Date: 2023-08-13 08:19+0000\n"
|
||||
"Last-Translator: Miha Perpar <miha.perpar2@gmail.com>\n"
|
||||
"PO-Revision-Date: 2024-08-21 16:58+0000\n"
|
||||
"Last-Translator: \"Matjaž T.\" <matjaz@moj-svet.si>\n"
|
||||
"Language-Team: Slovenian <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/sl/>\n"
|
||||
"Language: sl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
|
||||
"%100==4 ? 2 : 3;\n"
|
||||
"X-Generator: Weblate 4.15\n"
|
||||
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
|
||||
"n%100==4 ? 2 : 3;\n"
|
||||
"X-Generator: Weblate 5.6.2\n"
|
||||
|
||||
#: .\cookbook\forms.py:45
|
||||
msgid ""
|
||||
@@ -89,14 +89,16 @@ msgid ""
|
||||
"<a href=\"https://www.home-assistant.io/docs/authentication/#your-account-"
|
||||
"profile\">Long Lived Access Token</a> for your HomeAssistant instance"
|
||||
msgstr ""
|
||||
"<a href=\"https://www.home-assistant.io/docs/authentication/#your-account-"
|
||||
"profile\">Dolgoročen dostopni žeton</a> za vašo HomeAssistant instanco"
|
||||
|
||||
#: .\cookbook\forms.py:193
|
||||
msgid "Something like http://homeassistant.local:8123/api"
|
||||
msgstr ""
|
||||
msgstr "Nekaj podobnega http://homeassistant.local:8123/api"
|
||||
|
||||
#: .\cookbook\forms.py:205
|
||||
msgid "http://homeassistant.local:8123/api for example"
|
||||
msgstr ""
|
||||
msgstr "http://homeassistant.local:8123/api na primer"
|
||||
|
||||
#: .\cookbook\forms.py:222 .\cookbook\views\edit.py:117
|
||||
msgid "Storage"
|
||||
@@ -202,45 +204,49 @@ msgid ""
|
||||
"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods "
|
||||
"only function with fulltext fields."
|
||||
msgstr ""
|
||||
"Polja za iskanje po celotnem besedilu. Opomba: metode iskanja 'web', "
|
||||
"'phrase' in 'raw' delujejo samo s polnimi besedilnimi polji."
|
||||
|
||||
#: .\cookbook\forms.py:350
|
||||
msgid "Search Method"
|
||||
msgstr ""
|
||||
msgstr "Metoda iskanja"
|
||||
|
||||
#: .\cookbook\forms.py:350
|
||||
msgid "Fuzzy Lookups"
|
||||
msgstr ""
|
||||
msgstr "Mehka iskanja"
|
||||
|
||||
#: .\cookbook\forms.py:350
|
||||
msgid "Ignore Accent"
|
||||
msgstr ""
|
||||
msgstr "Prezri naglas"
|
||||
|
||||
#: .\cookbook\forms.py:350
|
||||
msgid "Partial Match"
|
||||
msgstr ""
|
||||
msgstr "Delno ujemanje"
|
||||
|
||||
#: .\cookbook\forms.py:350
|
||||
msgid "Starts With"
|
||||
msgstr ""
|
||||
msgstr "Se začne s/z"
|
||||
|
||||
#: .\cookbook\forms.py:351
|
||||
msgid "Fuzzy Search"
|
||||
msgstr ""
|
||||
msgstr "Mehko iskanje"
|
||||
|
||||
#: .\cookbook\forms.py:351
|
||||
msgid "Full Text"
|
||||
msgstr ""
|
||||
msgstr "Celotno besedilo"
|
||||
|
||||
#: .\cookbook\helper\AllAuthCustomAdapter.py:41
|
||||
msgid ""
|
||||
"In order to prevent spam, the requested email was not send. Please wait a "
|
||||
"few minutes and try again."
|
||||
msgstr ""
|
||||
"Da bi preprečili vsiljeno pošto, zahtevana e-pošta ni bila poslana. "
|
||||
"Počakajte nekaj minut in poskusite znova."
|
||||
|
||||
#: .\cookbook\helper\permission_helper.py:164
|
||||
#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117
|
||||
msgid "You are not logged in and therefore cannot view this page!"
|
||||
msgstr ""
|
||||
msgstr "Niste prijavljeni in si zato ne morete ogledati te strani!"
|
||||
|
||||
#: .\cookbook\helper\permission_helper.py:168
|
||||
#: .\cookbook\helper\permission_helper.py:174
|
||||
@@ -253,48 +259,46 @@ msgstr ""
|
||||
#: .\cookbook\helper\permission_helper.py:341 .\cookbook\views\data.py:35
|
||||
#: .\cookbook\views\views.py:127 .\cookbook\views\views.py:131
|
||||
msgid "You do not have the required permissions to view this page!"
|
||||
msgstr ""
|
||||
msgstr "Nimate potrebnih dovoljenj za ogled te strani!"
|
||||
|
||||
#: .\cookbook\helper\permission_helper.py:192
|
||||
#: .\cookbook\helper\permission_helper.py:215
|
||||
#: .\cookbook\helper\permission_helper.py:237
|
||||
#: .\cookbook\helper\permission_helper.py:252
|
||||
msgid "You cannot interact with this object as it is not owned by you!"
|
||||
msgstr ""
|
||||
msgstr "S tem predmetom ne morete komunicirati, ker ni v vaši lasti!"
|
||||
|
||||
#: .\cookbook\helper\permission_helper.py:402
|
||||
msgid "You have reached the maximum number of recipes for your space."
|
||||
msgstr ""
|
||||
msgstr "Dosegli ste največje število receptov za svoj prostor."
|
||||
|
||||
#: .\cookbook\helper\permission_helper.py:414
|
||||
msgid "You have more users than allowed in your space."
|
||||
msgstr ""
|
||||
msgstr "V vašem prostoru imate več uporabnikov, kot je dovoljeno."
|
||||
|
||||
#: .\cookbook\helper\recipe_url_import.py:310
|
||||
#, fuzzy
|
||||
#| msgid "Use fractions"
|
||||
msgid "reverse rotation"
|
||||
msgstr "Uporabi ulomke/frakcije"
|
||||
msgstr "obratno vrtenje"
|
||||
|
||||
#: .\cookbook\helper\recipe_url_import.py:311
|
||||
msgid "careful rotation"
|
||||
msgstr ""
|
||||
msgstr "previdno vrtenje"
|
||||
|
||||
#: .\cookbook\helper\recipe_url_import.py:312
|
||||
msgid "knead"
|
||||
msgstr ""
|
||||
msgstr "gnetemo"
|
||||
|
||||
#: .\cookbook\helper\recipe_url_import.py:313
|
||||
msgid "thicken"
|
||||
msgstr ""
|
||||
msgstr "zgostimo"
|
||||
|
||||
#: .\cookbook\helper\recipe_url_import.py:314
|
||||
msgid "warm up"
|
||||
msgstr ""
|
||||
msgstr "pogrejemo"
|
||||
|
||||
#: .\cookbook\helper\recipe_url_import.py:315
|
||||
msgid "ferment"
|
||||
msgstr ""
|
||||
msgstr "fermentiramo"
|
||||
|
||||
#: .\cookbook\helper\recipe_url_import.py:316
|
||||
msgid "sous-vide"
|
||||
@@ -302,7 +306,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\helper\shopping_helper.py:150
|
||||
msgid "You must supply a servings size"
|
||||
msgstr ""
|
||||
msgstr "Navesti morate velikost obrokov"
|
||||
|
||||
#: .\cookbook\helper\template_helper.py:95
|
||||
#: .\cookbook\helper\template_helper.py:97
|
||||
|
||||
@@ -8,8 +8,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
|
||||
"PO-Revision-Date: 2024-03-11 13:02+0000\n"
|
||||
"Last-Translator: Kn <kn@users.noreply.translate.tandoor.dev>\n"
|
||||
"PO-Revision-Date: 2024-09-17 11:58+0000\n"
|
||||
"Last-Translator: Bebbe K <kajolekk91@gmail.com>\n"
|
||||
"Language-Team: Swedish <http://translate.tandoor.dev/projects/tandoor/"
|
||||
"recipes-backend/sv/>\n"
|
||||
"Language: sv\n"
|
||||
@@ -17,7 +17,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.4.2\n"
|
||||
"X-Generator: Weblate 5.6.2\n"
|
||||
|
||||
#: .\cookbook\forms.py:45
|
||||
msgid ""
|
||||
@@ -151,48 +151,61 @@ msgid ""
|
||||
"Select type method of search. Click <a href=\"/docs/search/\">here</a> for "
|
||||
"full description of choices."
|
||||
msgstr ""
|
||||
"Välj typ av sökmetod. Klicka <a href=\"/docs/search/\">här</a> för "
|
||||
"fullständig beskrivning av alternativen."
|
||||
|
||||
#: .\cookbook\forms.py:341
|
||||
msgid ""
|
||||
"Use fuzzy matching on units, keywords and ingredients when editing and "
|
||||
"importing recipes."
|
||||
msgstr ""
|
||||
"Använd \"fuzzy\" matchning på enheter, nyckelord och ingredienser när du "
|
||||
"redigerar och importerar recept."
|
||||
|
||||
#: .\cookbook\forms.py:342
|
||||
msgid ""
|
||||
"Fields to search ignoring accents. Selecting this option can improve or "
|
||||
"degrade search quality depending on language"
|
||||
msgstr ""
|
||||
"Fält att söka medan man ignorerar accenter. Val av detta alternativ kan "
|
||||
"förbättra eller försämra sökkvaliteten beroende på språk"
|
||||
|
||||
#: .\cookbook\forms.py:343
|
||||
msgid ""
|
||||
"Fields to search for partial matches. (e.g. searching for 'Pie' will return "
|
||||
"'pie' and 'piece' and 'soapie')"
|
||||
msgstr ""
|
||||
"Fält att söka efter delvisa matchningar. (t.ex. att söka efter 'Pie' kommer "
|
||||
"att returnera 'pie' och 'piece' och 'soapie')"
|
||||
|
||||
#: .\cookbook\forms.py:344
|
||||
msgid ""
|
||||
"Fields to search for beginning of word matches. (e.g. searching for 'sa' "
|
||||
"will return 'salad' and 'sandwich')"
|
||||
msgstr ""
|
||||
"Fält att söka för matchningar i början av ord. (t.ex. att söka efter 'sa' "
|
||||
"kommer att returnera 'salad' och 'sandwich')"
|
||||
|
||||
#: .\cookbook\forms.py:345
|
||||
msgid ""
|
||||
"Fields to 'fuzzy' search. (e.g. searching for 'recpie' will find 'recipe'.) "
|
||||
"Note: this option will conflict with 'web' and 'raw' methods of search."
|
||||
msgstr ""
|
||||
"Fält för 'fuzzy'-sökning. (t.ex. att söka efter 'recpie' kommer att hitta "
|
||||
"'recipe'.Observera: detta alternativet kommer att komma i konflikt med "
|
||||
"sökmetoderna 'web' och 'raw'.)"
|
||||
|
||||
#: .\cookbook\forms.py:346
|
||||
msgid ""
|
||||
"Fields to full text search. Note: 'web', 'phrase', and 'raw' search methods "
|
||||
"only function with fulltext fields."
|
||||
msgstr ""
|
||||
"Fält för fulltextsökning. Observera: Sökmetoderna 'web', 'phrase' och 'raw' "
|
||||
"fungerar endast med fulltextfält."
|
||||
|
||||
#: .\cookbook\forms.py:350
|
||||
#, fuzzy
|
||||
#| msgid "Search"
|
||||
msgid "Search Method"
|
||||
msgstr "Sök"
|
||||
msgstr "Sök Metod"
|
||||
|
||||
#: .\cookbook\forms.py:350
|
||||
msgid "Fuzzy Lookups"
|
||||
@@ -211,22 +224,20 @@ msgid "Starts With"
|
||||
msgstr "Börjar med"
|
||||
|
||||
#: .\cookbook\forms.py:351
|
||||
#, fuzzy
|
||||
#| msgid "Search"
|
||||
msgid "Fuzzy Search"
|
||||
msgstr "Sök"
|
||||
msgstr "Fuzzy Sök"
|
||||
|
||||
#: .\cookbook\forms.py:351
|
||||
#, fuzzy
|
||||
#| msgid "Text"
|
||||
msgid "Full Text"
|
||||
msgstr "Text"
|
||||
msgstr "Hel Text"
|
||||
|
||||
#: .\cookbook\helper\AllAuthCustomAdapter.py:41
|
||||
msgid ""
|
||||
"In order to prevent spam, the requested email was not send. Please wait a "
|
||||
"few minutes and try again."
|
||||
msgstr ""
|
||||
"För att förhindra spam, så skickades inte den begärda e-posten. Vänta några "
|
||||
"minuter och försök igen."
|
||||
|
||||
#: .\cookbook\helper\permission_helper.py:164
|
||||
#: .\cookbook\helper\permission_helper.py:187 .\cookbook\views\views.py:117
|
||||
@@ -255,19 +266,19 @@ msgstr "Du kan inte interagera med detta objekt för att det ägs inte av dig!"
|
||||
|
||||
#: .\cookbook\helper\permission_helper.py:402
|
||||
msgid "You have reached the maximum number of recipes for your space."
|
||||
msgstr ""
|
||||
msgstr "Du har nått det maximala antalet recept för din utrymme."
|
||||
|
||||
#: .\cookbook\helper\permission_helper.py:414
|
||||
msgid "You have more users than allowed in your space."
|
||||
msgstr ""
|
||||
msgstr "Du har mer användare än tillåtet för ditt utrymme."
|
||||
|
||||
#: .\cookbook\helper\recipe_url_import.py:310
|
||||
msgid "reverse rotation"
|
||||
msgstr ""
|
||||
msgstr "återvänd rotering"
|
||||
|
||||
#: .\cookbook\helper\recipe_url_import.py:311
|
||||
msgid "careful rotation"
|
||||
msgstr ""
|
||||
msgstr "försiktig rotering"
|
||||
|
||||
#: .\cookbook\helper\recipe_url_import.py:312
|
||||
msgid "knead"
|
||||
@@ -291,7 +302,7 @@ msgstr "sous-vide"
|
||||
|
||||
#: .\cookbook\helper\shopping_helper.py:150
|
||||
msgid "You must supply a servings size"
|
||||
msgstr ""
|
||||
msgstr "Du måste ange en portionstorlek"
|
||||
|
||||
#: .\cookbook\helper\template_helper.py:95
|
||||
#: .\cookbook\helper\template_helper.py:97
|
||||
@@ -305,7 +316,7 @@ msgstr "Favorit"
|
||||
|
||||
#: .\cookbook\integration\copymethat.py:50
|
||||
msgid "I made this"
|
||||
msgstr ""
|
||||
msgstr "Jag gjorde den här"
|
||||
|
||||
#: .\cookbook\integration\integration.py:209
|
||||
msgid ""
|
||||
@@ -319,6 +330,8 @@ msgid ""
|
||||
"An unexpected error occurred during the import. Please make sure you have "
|
||||
"uploaded a valid file."
|
||||
msgstr ""
|
||||
"Ett oväntat fel uppstod under importeringen. Se till att du har laddat upp "
|
||||
"en giltig fil."
|
||||
|
||||
#: .\cookbook\integration\integration.py:217
|
||||
msgid "The following recipes were ignored because they already existed:"
|
||||
@@ -330,10 +343,8 @@ msgid "Imported %s recipes."
|
||||
msgstr "Importerade %s recept."
|
||||
|
||||
#: .\cookbook\integration\openeats.py:28
|
||||
#, fuzzy
|
||||
#| msgid "Recipe Home"
|
||||
msgid "Recipe source:"
|
||||
msgstr "Recept Hem"
|
||||
msgstr "Recept källa:"
|
||||
|
||||
#: .\cookbook\integration\paprika.py:49
|
||||
msgid "Notes"
|
||||
@@ -374,23 +385,25 @@ msgstr "Sektion"
|
||||
|
||||
#: .\cookbook\management\commands\fix_duplicate_properties.py:15
|
||||
msgid "Fixes foods with "
|
||||
msgstr ""
|
||||
msgstr "Korrigerar livsmedel med "
|
||||
|
||||
#: .\cookbook\management\commands\rebuildindex.py:14
|
||||
msgid "Rebuilds full text search index on Recipe"
|
||||
msgstr ""
|
||||
msgstr "Återuppbygger fulltextsökningens index för Recept"
|
||||
|
||||
#: .\cookbook\management\commands\rebuildindex.py:18
|
||||
msgid "Only Postgresql databases use full text search, no index to rebuild"
|
||||
msgstr ""
|
||||
"Endast Postgresql-databaser använder fulltextsökning, inget index att "
|
||||
"återuppbygga med"
|
||||
|
||||
#: .\cookbook\management\commands\rebuildindex.py:29
|
||||
msgid "Recipe index rebuild complete."
|
||||
msgstr ""
|
||||
msgstr "Recept index återbyggning färdig."
|
||||
|
||||
#: .\cookbook\management\commands\rebuildindex.py:31
|
||||
msgid "Recipe index rebuild failed."
|
||||
msgstr ""
|
||||
msgstr "Recept index återbyggning misslyckades."
|
||||
|
||||
#: .\cookbook\migrations\0047_auto_20200602_1133.py:14
|
||||
msgid "Breakfast"
|
||||
@@ -439,6 +452,8 @@ msgid ""
|
||||
"Maximum file storage for space in MB. 0 for unlimited, -1 to disable file "
|
||||
"upload."
|
||||
msgstr ""
|
||||
"Maximal lagringsutrymme för utrymme i MB. 0 för obegränsad, -1 för att "
|
||||
"inaktivera filuppladdning."
|
||||
|
||||
#: .\cookbook\models.py:454 .\cookbook\templates\search.html:7
|
||||
#: .\cookbook\templates\settings.html:18
|
||||
@@ -462,7 +477,7 @@ msgstr "Handla"
|
||||
|
||||
#: .\cookbook\models.py:752
|
||||
msgid " is part of a recipe step and cannot be deleted"
|
||||
msgstr ""
|
||||
msgstr " är en del av ett receptsteg och kan inte tas bort"
|
||||
|
||||
#: .\cookbook\models.py:918
|
||||
msgid "Nutrition"
|
||||
@@ -501,34 +516,24 @@ msgid "Food Alias"
|
||||
msgstr "Alternativt namn för mat"
|
||||
|
||||
#: .\cookbook\models.py:1468
|
||||
#, fuzzy
|
||||
#| msgid "Units"
|
||||
msgid "Unit Alias"
|
||||
msgstr "Enheter"
|
||||
msgstr "Enhetsalias"
|
||||
|
||||
#: .\cookbook\models.py:1469
|
||||
#, fuzzy
|
||||
#| msgid "Keywords"
|
||||
msgid "Keyword Alias"
|
||||
msgstr "Nyckelord"
|
||||
msgstr "Nyckelordsalias"
|
||||
|
||||
#: .\cookbook\models.py:1470
|
||||
#, fuzzy
|
||||
#| msgid "Description"
|
||||
msgid "Description Replace"
|
||||
msgstr "Beskrivning"
|
||||
msgstr "Beskrivning Ersätt"
|
||||
|
||||
#: .\cookbook\models.py:1471
|
||||
#, fuzzy
|
||||
#| msgid "Instructions"
|
||||
msgid "Instruction Replace"
|
||||
msgstr "Instruktioner"
|
||||
msgstr "Instruktioner Ersätt"
|
||||
|
||||
#: .\cookbook\models.py:1472
|
||||
#, fuzzy
|
||||
#| msgid "New Unit"
|
||||
msgid "Never Unit"
|
||||
msgstr "Ny enhet"
|
||||
msgstr "Aldrig Enhet"
|
||||
|
||||
#: .\cookbook\models.py:1473
|
||||
msgid "Transpose Words"
|
||||
@@ -539,10 +544,8 @@ msgid "Food Replace"
|
||||
msgstr "Ersätt mat"
|
||||
|
||||
#: .\cookbook\models.py:1475
|
||||
#, fuzzy
|
||||
#| msgid "Edit Recipe"
|
||||
msgid "Unit Replace"
|
||||
msgstr "Redigera recept"
|
||||
msgstr "Ersätt Enhet"
|
||||
|
||||
#: .\cookbook\models.py:1476
|
||||
msgid "Name Replace"
|
||||
|
||||
@@ -8,8 +8,8 @@ msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-08-01 15:04+0200\n"
|
||||
"PO-Revision-Date: 2024-02-15 03:19+0000\n"
|
||||
"Last-Translator: dalan <xzdlj@outlook.com>\n"
|
||||
"PO-Revision-Date: 2024-11-04 10:29+0000\n"
|
||||
"Last-Translator: Johnny Ip <ip.iohnny@gmail.com>\n"
|
||||
"Language-Team: Chinese (Simplified) <http://translate.tandoor.dev/projects/"
|
||||
"tandoor/recipes-backend/zh_Hans/>\n"
|
||||
"Language: zh_CN\n"
|
||||
@@ -17,7 +17,7 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 4.15\n"
|
||||
"X-Generator: Weblate 5.6.2\n"
|
||||
|
||||
#: .\cookbook\forms.py:45
|
||||
msgid ""
|
||||
@@ -86,14 +86,16 @@ msgid ""
|
||||
"<a href=\"https://www.home-assistant.io/docs/authentication/#your-account-"
|
||||
"profile\">Long Lived Access Token</a> for your HomeAssistant instance"
|
||||
msgstr ""
|
||||
"您的HomeAssistant示例的<a href=\"https://www.home-assistant.io/docs/"
|
||||
"authentication/#your-account-profile\">长期访问令牌</a>"
|
||||
|
||||
#: .\cookbook\forms.py:193
|
||||
msgid "Something like http://homeassistant.local:8123/api"
|
||||
msgstr ""
|
||||
msgstr "形如 http://homeassistant.local:8123/api"
|
||||
|
||||
#: .\cookbook\forms.py:205
|
||||
msgid "http://homeassistant.local:8123/api for example"
|
||||
msgstr ""
|
||||
msgstr "例如 http://homeassistant.local:8123/api"
|
||||
|
||||
#: .\cookbook\forms.py:222 .\cookbook\views\edit.py:117
|
||||
msgid "Storage"
|
||||
@@ -356,7 +358,7 @@ msgstr "准备时间"
|
||||
|
||||
#: .\cookbook\integration\saffron.py:29 .\cookbook\templates\index.html:7
|
||||
msgid "Cookbook"
|
||||
msgstr "菜谱"
|
||||
msgstr "烹饪手册"
|
||||
|
||||
#: .\cookbook\integration\saffron.py:31
|
||||
msgid "Section"
|
||||
@@ -364,7 +366,7 @@ msgstr "部分"
|
||||
|
||||
#: .\cookbook\management\commands\fix_duplicate_properties.py:15
|
||||
msgid "Fixes foods with "
|
||||
msgstr ""
|
||||
msgstr "修复食谱中的重复字段 "
|
||||
|
||||
#: .\cookbook\management\commands\rebuildindex.py:14
|
||||
msgid "Rebuilds full text search index on Recipe"
|
||||
@@ -400,29 +402,29 @@ msgstr "其他"
|
||||
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
|
||||
msgid "Fat"
|
||||
msgstr ""
|
||||
msgstr "脂肪"
|
||||
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:17
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:19
|
||||
msgid "g"
|
||||
msgstr ""
|
||||
msgstr "克"
|
||||
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:18
|
||||
msgid "Carbohydrates"
|
||||
msgstr ""
|
||||
msgstr "碳水化合物"
|
||||
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:19
|
||||
msgid "Proteins"
|
||||
msgstr ""
|
||||
msgstr "蛋白质"
|
||||
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:20
|
||||
msgid "Calories"
|
||||
msgstr ""
|
||||
msgstr "卡路里"
|
||||
|
||||
#: .\cookbook\migrations\0190_auto_20230525_1506.py:20
|
||||
msgid "kcal"
|
||||
msgstr ""
|
||||
msgstr "千卡"
|
||||
|
||||
#: .\cookbook\models.py:325
|
||||
msgid ""
|
||||
@@ -443,7 +445,7 @@ msgstr "膳食计划"
|
||||
#: .\cookbook\models.py:456 .\cookbook\templates\base.html:122
|
||||
#: .\cookbook\views\views.py:459
|
||||
msgid "Books"
|
||||
msgstr "书籍"
|
||||
msgstr "烹饪手册"
|
||||
|
||||
#: .\cookbook\models.py:457 .\cookbook\templates\base.html:118
|
||||
#: .\cookbook\views\views.py:460
|
||||
@@ -455,24 +457,20 @@ msgid " is part of a recipe step and cannot be deleted"
|
||||
msgstr " 是菜谱步骤的一部分,不能删除"
|
||||
|
||||
#: .\cookbook\models.py:918
|
||||
#, fuzzy
|
||||
#| msgid "Automations"
|
||||
msgid "Nutrition"
|
||||
msgstr "自动化"
|
||||
msgstr "营养"
|
||||
|
||||
#: .\cookbook\models.py:918
|
||||
#, fuzzy
|
||||
#| msgid "Merge"
|
||||
msgid "Allergen"
|
||||
msgstr "合并"
|
||||
msgstr "过敏原"
|
||||
|
||||
#: .\cookbook\models.py:919
|
||||
msgid "Price"
|
||||
msgstr ""
|
||||
msgstr "价格"
|
||||
|
||||
#: .\cookbook\models.py:919
|
||||
msgid "Goal"
|
||||
msgstr ""
|
||||
msgstr "目标"
|
||||
|
||||
#: .\cookbook\models.py:1408 .\cookbook\templates\search_info.html:28
|
||||
msgid "Simple"
|
||||
@@ -511,30 +509,24 @@ msgid "Instruction Replace"
|
||||
msgstr "指示"
|
||||
|
||||
#: .\cookbook\models.py:1472
|
||||
#, fuzzy
|
||||
#| msgid "New Unit"
|
||||
msgid "Never Unit"
|
||||
msgstr "新单位"
|
||||
msgstr "禁用单位识别"
|
||||
|
||||
#: .\cookbook\models.py:1473
|
||||
msgid "Transpose Words"
|
||||
msgstr ""
|
||||
msgstr "字符串转置"
|
||||
|
||||
#: .\cookbook\models.py:1474
|
||||
#, fuzzy
|
||||
#| msgid "Food Alias"
|
||||
msgid "Food Replace"
|
||||
msgstr "食物别名"
|
||||
msgstr "食物替换"
|
||||
|
||||
#: .\cookbook\models.py:1475
|
||||
#, fuzzy
|
||||
#| msgid "Description Replace"
|
||||
msgid "Unit Replace"
|
||||
msgstr "描述"
|
||||
msgstr "单位替换"
|
||||
|
||||
#: .\cookbook\models.py:1476
|
||||
msgid "Name Replace"
|
||||
msgstr ""
|
||||
msgstr "名称替换"
|
||||
|
||||
#: .\cookbook\models.py:1503 .\cookbook\views\delete.py:40
|
||||
#: .\cookbook\views\edit.py:210 .\cookbook\views\new.py:39
|
||||
@@ -571,7 +563,7 @@ msgstr "您已被邀请至 "
|
||||
|
||||
#: .\cookbook\serializer.py:1272
|
||||
msgid " to join their Tandoor Recipes space "
|
||||
msgstr " 加入他们的泥炉食谱空间 "
|
||||
msgstr " 加入他们的 Tandoor 食谱空间 "
|
||||
|
||||
#: .\cookbook\serializer.py:1274
|
||||
msgid "Click the following link to activate your account: "
|
||||
@@ -589,11 +581,11 @@ msgstr "邀请有效期至 "
|
||||
#: .\cookbook\serializer.py:1280
|
||||
msgid ""
|
||||
"Tandoor Recipes is an Open Source recipe manager. Check it out on GitHub "
|
||||
msgstr "泥炉食谱是一个开源食谱管理器。 在 GitHub 上查看 "
|
||||
msgstr "Tandoor 是一个开源食谱管理器。 在 GitHub 上查看 "
|
||||
|
||||
#: .\cookbook\serializer.py:1283
|
||||
msgid "Tandoor Recipes Invite"
|
||||
msgstr "泥炉食谱邀请"
|
||||
msgstr "Tandoor 食谱邀请"
|
||||
|
||||
#: .\cookbook\serializer.py:1426
|
||||
msgid "Existing shopping list to update"
|
||||
@@ -979,13 +971,11 @@ msgstr "导出"
|
||||
|
||||
#: .\cookbook\templates\base.html:287
|
||||
msgid "Properties"
|
||||
msgstr ""
|
||||
msgstr "属性"
|
||||
|
||||
#: .\cookbook\templates\base.html:301 .\cookbook\views\lists.py:255
|
||||
#, fuzzy
|
||||
#| msgid "Account Connections"
|
||||
msgid "Unit Conversions"
|
||||
msgstr "帐号连接"
|
||||
msgstr "单位转换"
|
||||
|
||||
#: .\cookbook\templates\base.html:318 .\cookbook\templates\index.html:47
|
||||
msgid "Import Recipe"
|
||||
@@ -1005,10 +995,8 @@ msgid "Space Settings"
|
||||
msgstr "空间设置"
|
||||
|
||||
#: .\cookbook\templates\base.html:340
|
||||
#, fuzzy
|
||||
#| msgid "External Recipes"
|
||||
msgid "External Connectors"
|
||||
msgstr "外部菜谱"
|
||||
msgstr "外部连接器"
|
||||
|
||||
#: .\cookbook\templates\base.html:345 .\cookbook\templates\system.html:13
|
||||
msgid "System"
|
||||
@@ -1038,7 +1026,7 @@ msgstr "GitHub"
|
||||
|
||||
#: .\cookbook\templates\base.html:376
|
||||
msgid "Translate Tandoor"
|
||||
msgstr "翻译泥炉"
|
||||
msgstr "翻译 Tandoor"
|
||||
|
||||
#: .\cookbook\templates\base.html:380
|
||||
msgid "API Browser"
|
||||
@@ -1050,7 +1038,7 @@ msgstr "退出"
|
||||
|
||||
#: .\cookbook\templates\base.html:406
|
||||
msgid "You are using the free version of Tandor"
|
||||
msgstr "你正在使用免费版的泥炉"
|
||||
msgstr "你正在使用免费版的 Tandoor"
|
||||
|
||||
#: .\cookbook\templates\base.html:407
|
||||
msgid "Upgrade Now"
|
||||
@@ -1123,7 +1111,7 @@ msgstr "这可能需要几分钟,取决于同步的菜谱数量,请等待。
|
||||
|
||||
#: .\cookbook\templates\books.html:7
|
||||
msgid "Recipe Books"
|
||||
msgstr "菜谱书"
|
||||
msgstr "烹饪手册"
|
||||
|
||||
#: .\cookbook\templates\export.html:7 .\cookbook\templates\test2.html:6
|
||||
msgid "Export Recipes"
|
||||
@@ -1453,10 +1441,8 @@ msgid "Back"
|
||||
msgstr "返回"
|
||||
|
||||
#: .\cookbook\templates\property_editor.html:7
|
||||
#, fuzzy
|
||||
#| msgid "Ingredient Editor"
|
||||
msgid "Property Editor"
|
||||
msgstr "食材编辑器"
|
||||
msgstr "属性编辑器"
|
||||
|
||||
#: .\cookbook\templates\recipe_view.html:36
|
||||
msgid "Comments"
|
||||
@@ -1770,7 +1756,7 @@ msgstr "非常适合大型数据库"
|
||||
|
||||
#: .\cookbook\templates\setup.html:6 .\cookbook\templates\system.html:5
|
||||
msgid "Cookbook Setup"
|
||||
msgstr "安装菜谱"
|
||||
msgstr "安装菜谱应用"
|
||||
|
||||
#: .\cookbook\templates\setup.html:14
|
||||
msgid "Setup"
|
||||
@@ -1879,10 +1865,8 @@ msgid "Sign in using"
|
||||
msgstr "登录使用"
|
||||
|
||||
#: .\cookbook\templates\space_manage.html:7
|
||||
#, fuzzy
|
||||
#| msgid "Space Membership"
|
||||
msgid "Space Management"
|
||||
msgstr "成员"
|
||||
msgstr "空间管理"
|
||||
|
||||
#: .\cookbook\templates\space_manage.html:26
|
||||
msgid "Space:"
|
||||
@@ -1974,6 +1958,10 @@ msgid ""
|
||||
"script to generate version information (done automatically in docker).\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" 您需要在您的更新脚本中执行 <code>version.py</code> "
|
||||
"生成版本信息(Docker实例中会自动执行)。\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\system.html:46
|
||||
msgid "Media Serving"
|
||||
@@ -2000,9 +1988,11 @@ msgid ""
|
||||
" your installation.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"<b>不推荐</b> 使用 gunicorn/python 提供媒体文件。\n"
|
||||
" 请按照 <a href=\"https://github.com/vabene1111/recipes/releases/"
|
||||
"tag/0.8.1\">这里</a> 描述的步骤操作更新安装。\n"
|
||||
"<b>不推荐</b> 使用 gunicorn/python 提供媒体文件!\n"
|
||||
" 请按照\n"
|
||||
" <a href=\"https://github.com/vabene1111/recipes/releases/tag/0.8."
|
||||
"1\">这里</a> 描述的步骤\n"
|
||||
" 操作更新安装。\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\system.html:55 .\cookbook\templates\system.html:70
|
||||
@@ -2057,7 +2047,7 @@ msgstr ""
|
||||
|
||||
#: .\cookbook\templates\system.html:86
|
||||
msgid "Allowed Hosts"
|
||||
msgstr ""
|
||||
msgstr "域名白名单"
|
||||
|
||||
#: .\cookbook\templates\system.html:90
|
||||
msgid ""
|
||||
@@ -2067,6 +2057,10 @@ msgid ""
|
||||
"this.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" 您未配置域名白名单,本实例可以通过任意域名访问,某些特殊情况下可"
|
||||
"能有用,但请尽量避免这样配置,请参考文档配置 ALLOWED_HOSTS 。\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\system.html:97
|
||||
msgid "Database"
|
||||
@@ -2077,10 +2071,8 @@ msgid "Info"
|
||||
msgstr "信息"
|
||||
|
||||
#: .\cookbook\templates\system.html:110 .\cookbook\templates\system.html:127
|
||||
#, fuzzy
|
||||
#| msgid "Use fractions"
|
||||
msgid "Migrations"
|
||||
msgstr "使用分数"
|
||||
msgstr "数据库结构变更"
|
||||
|
||||
#: .\cookbook\templates\system.html:116
|
||||
msgid ""
|
||||
@@ -2093,24 +2085,28 @@ msgid ""
|
||||
"issue.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" 正常情况下数据库迁移不应产生任何报错!\n"
|
||||
" 数据库迁移失败很可能导致本应用的功能出错或完全不可用。\n"
|
||||
" 如果您在最新版本上数据库迁移依然产生错误,"
|
||||
"请将数据库迁移日志和页面下方的信息反馈至 Github Issue 中。\n"
|
||||
" "
|
||||
|
||||
#: .\cookbook\templates\system.html:182
|
||||
msgid "False"
|
||||
msgstr ""
|
||||
msgstr "否"
|
||||
|
||||
#: .\cookbook\templates\system.html:182
|
||||
msgid "True"
|
||||
msgstr ""
|
||||
msgstr "是"
|
||||
|
||||
#: .\cookbook\templates\system.html:207
|
||||
msgid "Hide"
|
||||
msgstr ""
|
||||
msgstr "隐藏"
|
||||
|
||||
#: .\cookbook\templates\system.html:210
|
||||
#, fuzzy
|
||||
#| msgid "Show Log"
|
||||
msgid "Show"
|
||||
msgstr "显示记录"
|
||||
msgstr "显示"
|
||||
|
||||
#: .\cookbook\templates\url_import.html:8
|
||||
msgid "URL Import"
|
||||
@@ -2184,17 +2180,15 @@ msgstr "{obj.name} 已添加到购物清单中。"
|
||||
|
||||
#: .\cookbook\views\api.py:742
|
||||
msgid "Filter meal plans from date (inclusive) in the format of YYYY-MM-DD."
|
||||
msgstr ""
|
||||
msgstr "指定开始日期以过滤膳食计划(包含选择的日期),日期格式为 YYYY-MM-DD。"
|
||||
|
||||
#: .\cookbook\views\api.py:743
|
||||
msgid "Filter meal plans to date (inclusive) in the format of YYYY-MM-DD."
|
||||
msgstr ""
|
||||
msgstr "指定结束日期以过滤膳食计划(包含选择的日期),日期格式为 YYYY-MM-DD。"
|
||||
|
||||
#: .\cookbook\views\api.py:744
|
||||
#, fuzzy
|
||||
#| msgid "ID of recipe a step is part of. For multiple repeat parameter."
|
||||
msgid "Filter meal plans with MealType ID. For multiple repeat parameter."
|
||||
msgstr "食谱中的步骤ID。 对于多个重复参数。"
|
||||
msgstr "指定 MealType ID 以过滤膳食计划,重复此参数以选择多个对象。"
|
||||
|
||||
#: .\cookbook\views\api.py:872
|
||||
msgid "ID of recipe a step is part of. For multiple repeat parameter."
|
||||
@@ -2341,17 +2335,13 @@ msgid ""
|
||||
msgstr "返回主键为 id 的购物清单条目。 允许多个值。"
|
||||
|
||||
#: .\cookbook\views\api.py:1125
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "Filter shopping list entries on checked. [true, false, both, <b>recent</"
|
||||
#| "b>]<br> - recent includes unchecked items and recently completed items."
|
||||
msgid ""
|
||||
"Filter shopping list entries on checked. [true, false, both, <b>recent</"
|
||||
"b>]<br> - recent includes unchecked items and recently "
|
||||
"completed items."
|
||||
msgstr ""
|
||||
"在选中时筛选购物清单列表。 [真, 假, 两者都有, <b>最近</b>]<br> - 最近包括未"
|
||||
"选中的项目和最近完成的项目。"
|
||||
"勾选并筛选购物清单列表。 [真, 假, 两者都有, <b>最近</b>]"
|
||||
"<br> - 最近包括未选中的项目和最近完成的项目。"
|
||||
|
||||
#: .\cookbook\views\api.py:1128
|
||||
msgid "Returns the shopping list entries sorted by supermarket category order."
|
||||
@@ -2359,17 +2349,13 @@ msgstr "返回按超市分类排序的购物清单列表。"
|
||||
|
||||
#: .\cookbook\views\api.py:1210
|
||||
msgid "Filter for entries with the given recipe"
|
||||
msgstr ""
|
||||
msgstr "筛选包含所选食谱的对象"
|
||||
|
||||
#: .\cookbook\views\api.py:1292
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "Returns the shopping list entry with a primary key of id. Multiple "
|
||||
#| "values allowed."
|
||||
msgid ""
|
||||
"Return the Automations matching the automation type. Multiple values "
|
||||
"allowed."
|
||||
msgstr "返回主键为 id 的购物清单条目。 允许多个值。"
|
||||
msgstr "返回与自动化类型相匹配的自动化条目。 允许多个值。"
|
||||
|
||||
#: .\cookbook\views\api.py:1415
|
||||
msgid "Nothing to do."
|
||||
@@ -2393,7 +2379,7 @@ msgstr "找不到可用的数据。"
|
||||
|
||||
#: .\cookbook\views\api.py:1549
|
||||
msgid "File is above space limit"
|
||||
msgstr ""
|
||||
msgstr "文件大小超出空间限值"
|
||||
|
||||
#: .\cookbook\views\api.py:1566 .\cookbook\views\import_export.py:114
|
||||
msgid "Importing is not implemented for this provider"
|
||||
@@ -2403,7 +2389,7 @@ msgstr "此提供程序未实现导入"
|
||||
#: .\cookbook\views\edit.py:88 .\cookbook\views\new.py:63
|
||||
#: .\cookbook\views\new.py:82
|
||||
msgid "This feature is not yet available in the hosted version of tandoor!"
|
||||
msgstr "此功能在泥炉的托管版本中尚不可用!"
|
||||
msgstr "此功能在 Tandoor 的托管版本中尚不可用!"
|
||||
|
||||
#: .\cookbook\views\api.py:1671
|
||||
msgid "Sync successful!"
|
||||
@@ -2434,10 +2420,8 @@ msgid ""
|
||||
msgstr "无法删除此存储后端,因为它至少在一台显示器中使用。"
|
||||
|
||||
#: .\cookbook\views\delete.py:135
|
||||
#, fuzzy
|
||||
#| msgid "Storage Backend"
|
||||
msgid "Connectors Config Backend"
|
||||
msgstr "存储后端"
|
||||
msgstr "连接器后端配置"
|
||||
|
||||
#: .\cookbook\views\delete.py:157
|
||||
msgid "Invite Link"
|
||||
@@ -2460,14 +2444,12 @@ msgid "There was an error updating this storage backend!"
|
||||
msgstr "更新此存储后端时出错!"
|
||||
|
||||
#: .\cookbook\views\edit.py:134
|
||||
#, fuzzy
|
||||
#| msgid "Changes saved!"
|
||||
msgid "Config saved!"
|
||||
msgstr "更改已保存!"
|
||||
msgstr "配置已保存!"
|
||||
|
||||
#: .\cookbook\views\edit.py:142
|
||||
msgid "ConnectorConfig"
|
||||
msgstr ""
|
||||
msgstr "连接器配置"
|
||||
|
||||
#: .\cookbook\views\edit.py:198
|
||||
msgid "Changes saved!"
|
||||
@@ -2496,10 +2478,8 @@ msgid "Shopping List"
|
||||
msgstr "采购单"
|
||||
|
||||
#: .\cookbook\views\lists.py:77 .\cookbook\views\new.py:98
|
||||
#, fuzzy
|
||||
#| msgid "Storage Backend"
|
||||
msgid "Connector Config Backend"
|
||||
msgstr "存储后端"
|
||||
msgstr "连接器后端配置"
|
||||
|
||||
#: .\cookbook\views\lists.py:91
|
||||
msgid "Invite Links"
|
||||
@@ -2523,13 +2503,11 @@ msgstr "步骤"
|
||||
|
||||
#: .\cookbook\views\lists.py:270
|
||||
msgid "Property Types"
|
||||
msgstr ""
|
||||
msgstr "属性类型"
|
||||
|
||||
#: .\cookbook\views\new.py:86
|
||||
#, fuzzy
|
||||
#| msgid "This feature is not available in the demo version!"
|
||||
msgid "This feature is not enabled by the server admin!"
|
||||
msgstr "此功能在演示版本中不可用!"
|
||||
msgstr "此功能被服务器管理员禁用!"
|
||||
|
||||
#: .\cookbook\views\new.py:123
|
||||
msgid "Imported new recipe!"
|
||||
@@ -2545,11 +2523,9 @@ msgid "This feature is not available in the demo version!"
|
||||
msgstr "此功能在演示版本中不可用!"
|
||||
|
||||
#: .\cookbook\views\views.py:74
|
||||
#, fuzzy
|
||||
#| msgid "You have reached the maximum number of recipes for your space."
|
||||
msgid ""
|
||||
"You have the reached the maximum amount of spaces that can be owned by you."
|
||||
msgstr "你已经达到了空间的菜谱的最大数量。"
|
||||
msgstr "你拥有的空间数量已经达到上限。"
|
||||
|
||||
#: .\cookbook\views\views.py:89
|
||||
msgid ""
|
||||
@@ -2582,48 +2558,32 @@ msgstr "模糊搜索与此搜索方法不兼容!"
|
||||
#: .\cookbook\views\views.py:306
|
||||
#, python-format
|
||||
msgid "PostgreSQL %(v)s is deprecated. Upgrade to a fully supported version!"
|
||||
msgstr ""
|
||||
msgstr "PostgreSQL %(v)s 版本过时。请升级到支持的版本!"
|
||||
|
||||
#: .\cookbook\views\views.py:309
|
||||
#, python-format
|
||||
msgid "You are running PostgreSQL %(v1)s. PostgreSQL %(v2)s is recommended"
|
||||
msgstr ""
|
||||
msgstr "您运行的 PostgreSQL 版本是 %(v1)s。推荐版本为 PostgreSQL %(v2)s"
|
||||
|
||||
#: .\cookbook\views\views.py:313
|
||||
msgid "Unable to determine PostgreSQL version."
|
||||
msgstr ""
|
||||
msgstr "无法确认 PostgreSQL 版本。"
|
||||
|
||||
#: .\cookbook\views\views.py:317
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "\n"
|
||||
#| " This application is not running with a Postgres database "
|
||||
#| "backend. This is ok but not recommended as some\n"
|
||||
#| " features only work with postgres databases.\n"
|
||||
#| " "
|
||||
msgid ""
|
||||
"This application is not running with a Postgres database backend. This is ok "
|
||||
"but not recommended as some features only work with postgres databases."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" 此应用程序未使用 PostgreSQL 数据库在后端运行。 这并没有关系,但这"
|
||||
"是不推荐的,\n"
|
||||
" 因为有些功能仅适用于 PostgreSQL 数据库。\n"
|
||||
" "
|
||||
msgstr "此应用未使用 PostgreSQL 数据库作为后端。 这是可运行的配置,但不推荐,"
|
||||
"因为部分功能仅在 PostgreSQL 数据库下可用。"
|
||||
|
||||
#: .\cookbook\views\views.py:360
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "The setup page can only be used to create the first user! If you have "
|
||||
#| "forgotten your superuser credentials please consult the django "
|
||||
#| "documentation on how to reset passwords."
|
||||
msgid ""
|
||||
"The setup page can only be used to create the first "
|
||||
"user! If you have forgotten your superuser credentials "
|
||||
"please consult the django documentation on how to reset passwords."
|
||||
msgstr ""
|
||||
"设置页面只能用于创建第一个用户!如果您忘记了超级用户凭据,请参阅 Django 文"
|
||||
"档,了解如何重置密码。"
|
||||
"设置页面只能用于创建第一个用户! "
|
||||
"如果您忘记了超级用户凭据,请参阅 Django 文档,了解如何重置密码。"
|
||||
|
||||
#: .\cookbook\views\views.py:369
|
||||
msgid "Passwords dont match!"
|
||||
@@ -2659,27 +2619,23 @@ msgstr "菜谱共享链接已被禁用!有关更多信息,请与页面管理
|
||||
|
||||
#: .\cookbook\views\views.py:451
|
||||
msgid "Manage recipes, shopping list, meal plans and more."
|
||||
msgstr ""
|
||||
msgstr "管理菜谱、购物清单、膳食计划等。"
|
||||
|
||||
#: .\cookbook\views\views.py:458
|
||||
#, fuzzy
|
||||
#| msgid "Meal-Plan"
|
||||
msgid "Plan"
|
||||
msgstr "膳食计划"
|
||||
msgstr "计划"
|
||||
|
||||
#: .\cookbook\views\views.py:458
|
||||
msgid "View your meal Plan"
|
||||
msgstr ""
|
||||
msgstr "查看您的膳食计划"
|
||||
|
||||
#: .\cookbook\views\views.py:459
|
||||
msgid "View your cookbooks"
|
||||
msgstr ""
|
||||
msgstr "查看你的烹饪手册"
|
||||
|
||||
#: .\cookbook\views\views.py:460
|
||||
#, fuzzy
|
||||
#| msgid "New Shopping List"
|
||||
msgid "View your shopping lists"
|
||||
msgstr "新购物清单"
|
||||
msgstr "查看你的购物清单"
|
||||
|
||||
#~ msgid "Default unit"
|
||||
#~ msgstr "默认单位"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.2.15 on 2024-09-15 10:30
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('cookbook', '0218_alter_mealplan_from_date_alter_mealplan_to_date'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='connectorconfig',
|
||||
name='supports_description_field',
|
||||
field=models.BooleanField(default=True, help_text='Does the todo entity support the description field'),
|
||||
),
|
||||
]
|
||||
@@ -406,6 +406,7 @@ class ConnectorConfig(models.Model, PermissionModelMixin):
|
||||
on_shopping_list_entry_created_enabled = models.BooleanField(default=False)
|
||||
on_shopping_list_entry_updated_enabled = models.BooleanField(default=False)
|
||||
on_shopping_list_entry_deleted_enabled = models.BooleanField(default=False)
|
||||
supports_description_field = models.BooleanField(default=True, help_text="Does the todo entity support the description field")
|
||||
|
||||
url = models.URLField(blank=True, null=True)
|
||||
token = models.CharField(max_length=512, blank=True, null=True)
|
||||
|
||||
@@ -427,7 +427,7 @@ class ConnectorConfigConfigSerializer(SpacedModelSerializer):
|
||||
fields = (
|
||||
'id', 'name', 'url', 'token', 'todo_entity', 'enabled',
|
||||
'on_shopping_list_entry_created_enabled', 'on_shopping_list_entry_updated_enabled',
|
||||
'on_shopping_list_entry_deleted_enabled', 'created_by'
|
||||
'on_shopping_list_entry_deleted_enabled', 'supports_description_field', 'created_by'
|
||||
)
|
||||
|
||||
read_only_fields = ('created_by',)
|
||||
|
||||
@@ -403,7 +403,7 @@
|
||||
|
||||
{% if HOSTED and request.space.max_recipes == 10 %}
|
||||
<div class="bg-warning" style=" width: 100%; text-align: center!important; color: #ffffff; padding: 8px">
|
||||
{% trans 'You are using the free version of Tandor' %} <a class="btn-success btn-sm"
|
||||
{% trans 'You are using the free version of Tandoor' %} <a class="btn-success btn-sm"
|
||||
href="https://tandoor.dev/manage">{% trans 'Upgrade Now' %}</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -82,9 +82,9 @@
|
||||
{% else %}
|
||||
{% trans 'Everything is fine!' %}
|
||||
{% endif %}
|
||||
|
||||
|
||||
<h4 class="mt-3">{% trans 'Allowed Hosts' %} <span
|
||||
class="badge badge-{% if '*' in allowed_hosts %}warning{% else %}success{% endif %}">{% if '*' in allowed_hosts %}
|
||||
class="badge badge-{% if '*' in allowed_hosts %}warning{% else %}success{% endif %}">{% if '*' in allowed_hosts %}
|
||||
{% trans 'Warning' %}{% else %}{% trans 'Ok' %}{% endif %}</span></h4>
|
||||
{% if debug %}
|
||||
{% blocktrans %}
|
||||
@@ -176,6 +176,33 @@
|
||||
{#{% endfor %}#}
|
||||
{# </textarea>#}
|
||||
|
||||
<h4 class="mt-3">API Stats</h4>
|
||||
<h6 >Space Stats</h6>
|
||||
<table class="table table-bordered table-striped">
|
||||
{% for r in api_space_stats %}
|
||||
<tr>
|
||||
{% for c in r %}
|
||||
<td>
|
||||
{{ c }}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
<h6 >Endpoint Stats</h6>
|
||||
<table class="table table-bordered table-striped">
|
||||
{% for r in api_stats %}
|
||||
<tr>
|
||||
{% for c in r %}
|
||||
<td>
|
||||
{{ c }}
|
||||
</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
<h4 class="mt-3">Debug</h4>
|
||||
<textarea class="form-control" rows="20">
|
||||
Gunicorn Media: {{ gunicorn_media }}
|
||||
|
||||
@@ -99,11 +99,23 @@ def test_add(arg, request, a1_s2, obj_1):
|
||||
assert r.status_code == arg[1]
|
||||
if r.status_code == 201:
|
||||
assert response['name'] == 'test'
|
||||
assert response['supports_description_field'] == True
|
||||
r = c.get(reverse(DETAIL_URL, args={response['id']}))
|
||||
assert r.status_code == 200
|
||||
r = a1_s2.get(reverse(DETAIL_URL, args={response['id']}))
|
||||
assert r.status_code == 404
|
||||
|
||||
def test_add_with_supports_description_field_false(a1_s2):
|
||||
r = a1_s2.post(
|
||||
reverse(LIST_URL),
|
||||
{'name': 'test', 'url': 'http://localhost:8123/api', 'token': '1234', 'enabled': 'true', 'supports_description_field': 'false'},
|
||||
content_type='application/json'
|
||||
)
|
||||
response = json.loads(r.content)
|
||||
print(r.content)
|
||||
assert r.status_code == 201
|
||||
assert response['name'] == 'test'
|
||||
assert response['supports_description_field'] == False
|
||||
|
||||
def test_delete(a1_s1, a1_s2, obj_1):
|
||||
r = a1_s2.delete(
|
||||
|
||||
@@ -12,6 +12,7 @@ from json import JSONDecodeError
|
||||
from urllib.parse import unquote
|
||||
from zipfile import ZipFile
|
||||
|
||||
import redis
|
||||
import requests
|
||||
from PIL import UnidentifiedImageError
|
||||
from annoying.decorators import ajax_request
|
||||
@@ -30,6 +31,7 @@ from django.http import FileResponse, HttpResponse, JsonResponse
|
||||
from django.shortcuts import get_object_or_404, redirect
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
from django.utils.datetime_safe import date
|
||||
from django.utils.translation import gettext as _
|
||||
from django_scopes import scopes_disabled
|
||||
from icalendar import Calendar, Event
|
||||
@@ -101,6 +103,46 @@ from recipes import settings
|
||||
from recipes.settings import DRF_THROTTLE_RECIPE_URL_IMPORT, FDC_API_KEY
|
||||
|
||||
|
||||
class LoggingMixin(object):
|
||||
"""
|
||||
logs request counts to redis cache total/per user/
|
||||
"""
|
||||
|
||||
def initial(self, request, *args, **kwargs):
|
||||
super(LoggingMixin, self).initial(request, *args, **kwargs)
|
||||
|
||||
if settings.REDIS_HOST:
|
||||
d = date.today().isoformat()
|
||||
space = request.space
|
||||
endpoint = request.resolver_match.url_name
|
||||
|
||||
r = redis.StrictRedis(
|
||||
host=settings.REDIS_HOST,
|
||||
port=settings.REDIS_PORT,
|
||||
username=settings.REDIS_USERNAME,
|
||||
password=settings.REDIS_PASSWORD,
|
||||
db=settings.REDIS_DATABASES['STATS'],
|
||||
)
|
||||
|
||||
pipe = r.pipeline()
|
||||
|
||||
# Global and daily tallies for all URLs.
|
||||
pipe.incr('api:request-count')
|
||||
pipe.incr(f'api:request-count:{d}')
|
||||
|
||||
# Use a sorted set to store the user stats, with the score representing
|
||||
# the number of queries the user made total or on a given day.
|
||||
pipe.zincrby(f'api:space-request-count', 1, space.pk)
|
||||
pipe.zincrby(f'api:space-request-count:{d}', 1, space.pk)
|
||||
|
||||
# Use a sorted set to store all the endpoints with score representing
|
||||
# the number of queries the endpoint received total or on a given day.
|
||||
pipe.zincrby(f'api:endpoint-request-count', 1, endpoint)
|
||||
pipe.zincrby(f'api:endpoint-request-count:{d}', 1, endpoint)
|
||||
|
||||
pipe.execute()
|
||||
|
||||
|
||||
class StandardFilterMixin(ViewSetMixin):
|
||||
|
||||
def get_queryset(self):
|
||||
@@ -184,9 +226,9 @@ class FuzzyFilterMixin(ViewSetMixin, ExtendedRecipeMixin):
|
||||
if query is not None and query not in ["''", '']:
|
||||
if fuzzy and (settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql'):
|
||||
if self.request.user.is_authenticated and any(
|
||||
[self.model.__name__.lower() in x for x in self.request.user.searchpreference.unaccent.values_list('field', flat=True)]
|
||||
):
|
||||
self.queryset = self.queryset.annotate(trigram=TrigramSimilarity('name__unaccent', query))
|
||||
[self.model.__name__.lower() in x for x in self.request.user.searchpreference.unaccent.values_list('field', flat=True)]
|
||||
):
|
||||
self.queryset = self.queryset.annotate(trigram=TrigramSimilarity('name__unaccent', query))
|
||||
else:
|
||||
self.queryset = self.queryset.annotate(trigram=TrigramSimilarity('name', query))
|
||||
self.queryset = self.queryset.order_by('-trigram')
|
||||
@@ -370,7 +412,7 @@ class TreeMixin(MergeMixin, FuzzyFilterMixin, ExtendedRecipeMixin):
|
||||
return Response(content, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
|
||||
class UserViewSet(viewsets.ModelViewSet):
|
||||
class UserViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
"""
|
||||
list:
|
||||
optional parameters
|
||||
@@ -394,14 +436,14 @@ class UserViewSet(viewsets.ModelViewSet):
|
||||
return queryset
|
||||
|
||||
|
||||
class GroupViewSet(viewsets.ModelViewSet):
|
||||
class GroupViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = Group.objects.all()
|
||||
serializer_class = GroupSerializer
|
||||
permission_classes = [CustomIsAdmin & CustomTokenHasReadWriteScope]
|
||||
http_method_names = ['get', ]
|
||||
|
||||
|
||||
class SpaceViewSet(viewsets.ModelViewSet):
|
||||
class SpaceViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = Space.objects
|
||||
serializer_class = SpaceSerializer
|
||||
permission_classes = [IsReadOnlyDRF & CustomIsGuest | CustomIsOwner & CustomIsAdmin & CustomTokenHasReadWriteScope]
|
||||
@@ -411,7 +453,7 @@ class SpaceViewSet(viewsets.ModelViewSet):
|
||||
return self.queryset.filter(id=self.request.space.id)
|
||||
|
||||
|
||||
class UserSpaceViewSet(viewsets.ModelViewSet):
|
||||
class UserSpaceViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = UserSpace.objects
|
||||
serializer_class = UserSpaceSerializer
|
||||
permission_classes = [(CustomIsSpaceOwner | CustomIsOwnerReadOnly) & CustomTokenHasReadWriteScope]
|
||||
@@ -434,7 +476,7 @@ class UserSpaceViewSet(viewsets.ModelViewSet):
|
||||
return self.queryset.filter(user=self.request.user, space=self.request.space)
|
||||
|
||||
|
||||
class UserPreferenceViewSet(viewsets.ModelViewSet):
|
||||
class UserPreferenceViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = UserPreference.objects
|
||||
serializer_class = UserPreferenceSerializer
|
||||
permission_classes = [CustomIsOwner & CustomTokenHasReadWriteScope]
|
||||
@@ -445,7 +487,7 @@ class UserPreferenceViewSet(viewsets.ModelViewSet):
|
||||
return self.queryset.filter(user=self.request.user)
|
||||
|
||||
|
||||
class StorageViewSet(viewsets.ModelViewSet):
|
||||
class StorageViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
# TODO handle delete protect error and adjust test
|
||||
queryset = Storage.objects
|
||||
serializer_class = StorageSerializer
|
||||
@@ -455,7 +497,7 @@ class StorageViewSet(viewsets.ModelViewSet):
|
||||
return self.queryset.filter(space=self.request.space)
|
||||
|
||||
|
||||
class ConnectorConfigConfigViewSet(viewsets.ModelViewSet):
|
||||
class ConnectorConfigConfigViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = ConnectorConfig.objects
|
||||
serializer_class = ConnectorConfigConfigSerializer
|
||||
permission_classes = [CustomIsAdmin & CustomTokenHasReadWriteScope]
|
||||
@@ -464,7 +506,7 @@ class ConnectorConfigConfigViewSet(viewsets.ModelViewSet):
|
||||
return self.queryset.filter(space=self.request.space)
|
||||
|
||||
|
||||
class SyncViewSet(viewsets.ModelViewSet):
|
||||
class SyncViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = Sync.objects
|
||||
serializer_class = SyncSerializer
|
||||
permission_classes = [CustomIsAdmin & CustomTokenHasReadWriteScope]
|
||||
@@ -473,7 +515,7 @@ class SyncViewSet(viewsets.ModelViewSet):
|
||||
return self.queryset.filter(space=self.request.space)
|
||||
|
||||
|
||||
class SyncLogViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
class SyncLogViewSet(LoggingMixin, viewsets.ReadOnlyModelViewSet):
|
||||
queryset = SyncLog.objects
|
||||
serializer_class = SyncLogSerializer
|
||||
permission_classes = [CustomIsAdmin & CustomTokenHasReadWriteScope]
|
||||
@@ -483,7 +525,7 @@ class SyncLogViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
return self.queryset.filter(sync__space=self.request.space)
|
||||
|
||||
|
||||
class SupermarketViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
||||
class SupermarketViewSet(LoggingMixin, viewsets.ModelViewSet, StandardFilterMixin):
|
||||
schema = FilterSchema()
|
||||
queryset = Supermarket.objects
|
||||
serializer_class = SupermarketSerializer
|
||||
@@ -494,7 +536,7 @@ class SupermarketViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
||||
return super().get_queryset()
|
||||
|
||||
|
||||
class SupermarketCategoryViewSet(viewsets.ModelViewSet, FuzzyFilterMixin, MergeMixin):
|
||||
class SupermarketCategoryViewSet(LoggingMixin, viewsets.ModelViewSet, FuzzyFilterMixin, MergeMixin):
|
||||
queryset = SupermarketCategory.objects
|
||||
model = SupermarketCategory
|
||||
serializer_class = SupermarketCategorySerializer
|
||||
@@ -505,7 +547,7 @@ class SupermarketCategoryViewSet(viewsets.ModelViewSet, FuzzyFilterMixin, MergeM
|
||||
return super().get_queryset()
|
||||
|
||||
|
||||
class SupermarketCategoryRelationViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
||||
class SupermarketCategoryRelationViewSet(LoggingMixin, viewsets.ModelViewSet, StandardFilterMixin):
|
||||
queryset = SupermarketCategoryRelation.objects
|
||||
serializer_class = SupermarketCategoryRelationSerializer
|
||||
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
|
||||
@@ -516,7 +558,7 @@ class SupermarketCategoryRelationViewSet(viewsets.ModelViewSet, StandardFilterMi
|
||||
return super().get_queryset()
|
||||
|
||||
|
||||
class KeywordViewSet(viewsets.ModelViewSet, TreeMixin):
|
||||
class KeywordViewSet(LoggingMixin, viewsets.ModelViewSet, TreeMixin):
|
||||
queryset = Keyword.objects
|
||||
model = Keyword
|
||||
serializer_class = KeywordSerializer
|
||||
@@ -524,7 +566,7 @@ class KeywordViewSet(viewsets.ModelViewSet, TreeMixin):
|
||||
pagination_class = DefaultPagination
|
||||
|
||||
|
||||
class UnitViewSet(viewsets.ModelViewSet, MergeMixin, FuzzyFilterMixin):
|
||||
class UnitViewSet(LoggingMixin, viewsets.ModelViewSet, MergeMixin, FuzzyFilterMixin):
|
||||
queryset = Unit.objects
|
||||
model = Unit
|
||||
serializer_class = UnitSerializer
|
||||
@@ -532,7 +574,7 @@ class UnitViewSet(viewsets.ModelViewSet, MergeMixin, FuzzyFilterMixin):
|
||||
pagination_class = DefaultPagination
|
||||
|
||||
|
||||
class FoodInheritFieldViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
class FoodInheritFieldViewSet(LoggingMixin, viewsets.ReadOnlyModelViewSet):
|
||||
queryset = FoodInheritField.objects
|
||||
serializer_class = FoodInheritFieldSerializer
|
||||
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
|
||||
@@ -543,7 +585,7 @@ class FoodInheritFieldViewSet(viewsets.ReadOnlyModelViewSet):
|
||||
return super().get_queryset()
|
||||
|
||||
|
||||
class FoodViewSet(viewsets.ModelViewSet, TreeMixin):
|
||||
class FoodViewSet(LoggingMixin, viewsets.ModelViewSet, TreeMixin):
|
||||
queryset = Food.objects
|
||||
model = Food
|
||||
serializer_class = FoodSerializer
|
||||
@@ -610,8 +652,8 @@ class FoodViewSet(viewsets.ModelViewSet, TreeMixin):
|
||||
return JsonResponse(
|
||||
{
|
||||
'msg':
|
||||
'API Key Rate Limit reached/exceeded, see https://api.data.gov/docs/rate-limits/ for more information. \
|
||||
Configure your key in Tandoor using environment FDC_API_KEY variable.'
|
||||
'API Key Rate Limit reached/exceeded, see https://api.data.gov/docs/rate-limits/ for more information. \
|
||||
Configure your key in Tandoor using environment FDC_API_KEY variable.'
|
||||
},
|
||||
status=429,
|
||||
json_dumps_params={'indent': 4})
|
||||
@@ -680,7 +722,7 @@ class FoodViewSet(viewsets.ModelViewSet, TreeMixin):
|
||||
return Response(content, status=status.HTTP_403_FORBIDDEN)
|
||||
|
||||
|
||||
class RecipeBookViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
||||
class RecipeBookViewSet(LoggingMixin, viewsets.ModelViewSet, StandardFilterMixin):
|
||||
queryset = RecipeBook.objects
|
||||
serializer_class = RecipeBookSerializer
|
||||
permission_classes = [(CustomIsOwner | CustomIsShared) & CustomTokenHasReadWriteScope]
|
||||
@@ -698,7 +740,7 @@ class RecipeBookViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
||||
return super().get_queryset()
|
||||
|
||||
|
||||
class RecipeBookEntryViewSet(viewsets.ModelViewSet, viewsets.GenericViewSet):
|
||||
class RecipeBookEntryViewSet(LoggingMixin, viewsets.ModelViewSet, viewsets.GenericViewSet):
|
||||
"""
|
||||
list:
|
||||
optional parameters
|
||||
@@ -724,7 +766,7 @@ class RecipeBookEntryViewSet(viewsets.ModelViewSet, viewsets.GenericViewSet):
|
||||
return queryset
|
||||
|
||||
|
||||
class MealPlanViewSet(viewsets.ModelViewSet):
|
||||
class MealPlanViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
"""
|
||||
list:
|
||||
optional parameters
|
||||
@@ -762,7 +804,7 @@ class MealPlanViewSet(viewsets.ModelViewSet):
|
||||
return queryset
|
||||
|
||||
|
||||
class AutoPlanViewSet(viewsets.ViewSet):
|
||||
class AutoPlanViewSet(LoggingMixin, viewsets.ViewSet):
|
||||
|
||||
def create(self, request):
|
||||
serializer = AutoMealPlanSerializer(data=request.data)
|
||||
@@ -824,7 +866,7 @@ class AutoPlanViewSet(viewsets.ViewSet):
|
||||
return Response(serializer.errors, 400)
|
||||
|
||||
|
||||
class MealTypeViewSet(viewsets.ModelViewSet):
|
||||
class MealTypeViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
"""
|
||||
returns list of meal types created by the
|
||||
requesting user ordered by the order field.
|
||||
@@ -838,7 +880,7 @@ class MealTypeViewSet(viewsets.ModelViewSet):
|
||||
return queryset
|
||||
|
||||
|
||||
class IngredientViewSet(viewsets.ModelViewSet):
|
||||
class IngredientViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = Ingredient.objects
|
||||
serializer_class = IngredientSerializer
|
||||
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
|
||||
@@ -862,7 +904,7 @@ class IngredientViewSet(viewsets.ModelViewSet):
|
||||
return queryset.select_related('food')
|
||||
|
||||
|
||||
class StepViewSet(viewsets.ModelViewSet):
|
||||
class StepViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = Step.objects
|
||||
serializer_class = StepSerializer
|
||||
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
|
||||
@@ -897,7 +939,7 @@ class RecipePagination(PageNumberPagination):
|
||||
return Response(OrderedDict([('count', self.page.paginator.count), ('next', self.get_next_link()), ('previous', self.get_previous_link()), ('results', data), ]))
|
||||
|
||||
|
||||
class RecipeViewSet(viewsets.ModelViewSet):
|
||||
class RecipeViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = Recipe.objects
|
||||
serializer_class = RecipeSerializer
|
||||
# TODO split read and write permission for meal plan guest
|
||||
@@ -1064,7 +1106,7 @@ class RecipeViewSet(viewsets.ModelViewSet):
|
||||
return Response(self.serializer_class(qs, many=True).data)
|
||||
|
||||
|
||||
class UnitConversionViewSet(viewsets.ModelViewSet):
|
||||
class UnitConversionViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = UnitConversion.objects
|
||||
serializer_class = UnitConversionSerializer
|
||||
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
|
||||
@@ -1081,7 +1123,7 @@ class UnitConversionViewSet(viewsets.ModelViewSet):
|
||||
return self.queryset.filter(space=self.request.space)
|
||||
|
||||
|
||||
class PropertyTypeViewSet(viewsets.ModelViewSet):
|
||||
class PropertyTypeViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = PropertyType.objects
|
||||
serializer_class = PropertyTypeSerializer
|
||||
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
|
||||
@@ -1090,7 +1132,7 @@ class PropertyTypeViewSet(viewsets.ModelViewSet):
|
||||
return self.queryset.filter(space=self.request.space)
|
||||
|
||||
|
||||
class PropertyViewSet(viewsets.ModelViewSet):
|
||||
class PropertyViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = Property.objects
|
||||
serializer_class = PropertySerializer
|
||||
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
|
||||
@@ -1099,7 +1141,7 @@ class PropertyViewSet(viewsets.ModelViewSet):
|
||||
return self.queryset.filter(space=self.request.space)
|
||||
|
||||
|
||||
class ShoppingListRecipeViewSet(viewsets.ModelViewSet):
|
||||
class ShoppingListRecipeViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = ShoppingListRecipe.objects
|
||||
serializer_class = ShoppingListRecipeSerializer
|
||||
permission_classes = [(CustomIsOwner | CustomIsShared) & CustomTokenHasReadWriteScope]
|
||||
@@ -1110,10 +1152,10 @@ class ShoppingListRecipeViewSet(viewsets.ModelViewSet):
|
||||
Q(entries__isnull=True)
|
||||
| Q(entries__created_by=self.request.user)
|
||||
| Q(entries__created_by__in=list(self.request.user.get_shopping_share()))
|
||||
).distinct().all()
|
||||
).distinct().all()
|
||||
|
||||
|
||||
class ShoppingListEntryViewSet(viewsets.ModelViewSet):
|
||||
class ShoppingListEntryViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = ShoppingListEntry.objects
|
||||
serializer_class = ShoppingListEntrySerializer
|
||||
permission_classes = [(CustomIsOwner | CustomIsShared) & CustomTokenHasReadWriteScope]
|
||||
@@ -1123,7 +1165,7 @@ class ShoppingListEntryViewSet(viewsets.ModelViewSet):
|
||||
name='checked',
|
||||
description=_('Filter shopping list entries on checked. [''true'', ''false'', ''both'', ''<b>recent</b>'']<br> \
|
||||
- ''recent'' includes unchecked items and recently completed items.')
|
||||
),
|
||||
),
|
||||
QueryParam(name='supermarket', description=_('Returns the shopping list entries sorted by supermarket category order.'), qtype='integer'),
|
||||
]
|
||||
schema = QueryParamAutoSchema()
|
||||
@@ -1171,7 +1213,7 @@ class ShoppingListEntryViewSet(viewsets.ModelViewSet):
|
||||
print(serializer.validated_data)
|
||||
bulk_entries = ShoppingListEntry.objects.filter(
|
||||
Q(created_by=self.request.user) | Q(created_by__in=list(self.request.user.get_shopping_share()))
|
||||
).filter(space=request.space, id__in=serializer.validated_data['ids'])
|
||||
).filter(space=request.space, id__in=serializer.validated_data['ids'])
|
||||
bulk_entries.update(checked=(checked := serializer.validated_data['checked']), updated_at=timezone.now(), )
|
||||
|
||||
# update the onhand for food if shopping_add_onhand is True
|
||||
@@ -1189,7 +1231,7 @@ class ShoppingListEntryViewSet(viewsets.ModelViewSet):
|
||||
return Response(serializer.errors, 400)
|
||||
|
||||
|
||||
class ViewLogViewSet(viewsets.ModelViewSet):
|
||||
class ViewLogViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = ViewLog.objects
|
||||
serializer_class = ViewLogSerializer
|
||||
permission_classes = [CustomIsOwner & CustomTokenHasReadWriteScope]
|
||||
@@ -1200,7 +1242,7 @@ class ViewLogViewSet(viewsets.ModelViewSet):
|
||||
return self.queryset.filter(created_by=self.request.user).filter(space=self.request.space)
|
||||
|
||||
|
||||
class CookLogViewSet(viewsets.ModelViewSet):
|
||||
class CookLogViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = CookLog.objects
|
||||
serializer_class = CookLogSerializer
|
||||
permission_classes = [CustomIsOwner & CustomTokenHasReadWriteScope]
|
||||
@@ -1215,7 +1257,7 @@ class CookLogViewSet(viewsets.ModelViewSet):
|
||||
return self.queryset.filter(space=self.request.space)
|
||||
|
||||
|
||||
class ImportLogViewSet(viewsets.ModelViewSet):
|
||||
class ImportLogViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = ImportLog.objects
|
||||
serializer_class = ImportLogSerializer
|
||||
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
|
||||
@@ -1225,7 +1267,7 @@ class ImportLogViewSet(viewsets.ModelViewSet):
|
||||
return self.queryset.filter(space=self.request.space)
|
||||
|
||||
|
||||
class ExportLogViewSet(viewsets.ModelViewSet):
|
||||
class ExportLogViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = ExportLog.objects
|
||||
serializer_class = ExportLogSerializer
|
||||
permission_classes = [CustomIsUser & CustomTokenHasReadWriteScope]
|
||||
@@ -1235,7 +1277,7 @@ class ExportLogViewSet(viewsets.ModelViewSet):
|
||||
return self.queryset.filter(space=self.request.space)
|
||||
|
||||
|
||||
class BookmarkletImportViewSet(viewsets.ModelViewSet):
|
||||
class BookmarkletImportViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = BookmarkletImport.objects
|
||||
serializer_class = BookmarkletImportSerializer
|
||||
permission_classes = [CustomIsUser & CustomTokenHasScope]
|
||||
@@ -1250,7 +1292,7 @@ class BookmarkletImportViewSet(viewsets.ModelViewSet):
|
||||
return self.queryset.filter(space=self.request.space).all()
|
||||
|
||||
|
||||
class UserFileViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
||||
class UserFileViewSet(LoggingMixin, viewsets.ModelViewSet, StandardFilterMixin):
|
||||
schema = FilterSchema()
|
||||
queryset = UserFile.objects
|
||||
serializer_class = UserFileSerializer
|
||||
@@ -1262,7 +1304,7 @@ class UserFileViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
||||
return super().get_queryset()
|
||||
|
||||
|
||||
class AutomationViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
||||
class AutomationViewSet(LoggingMixin, viewsets.ModelViewSet, StandardFilterMixin):
|
||||
"""
|
||||
list:
|
||||
optional parameters
|
||||
@@ -1313,7 +1355,7 @@ class AutomationViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
||||
return super().get_queryset()
|
||||
|
||||
|
||||
class InviteLinkViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
||||
class InviteLinkViewSet(LoggingMixin, viewsets.ModelViewSet, StandardFilterMixin):
|
||||
queryset = InviteLink.objects
|
||||
serializer_class = InviteLinkSerializer
|
||||
permission_classes = [CustomIsSpaceOwner & CustomIsAdmin & CustomTokenHasReadWriteScope]
|
||||
@@ -1331,7 +1373,7 @@ class InviteLinkViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
||||
return None
|
||||
|
||||
|
||||
class CustomFilterViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
||||
class CustomFilterViewSet(LoggingMixin, viewsets.ModelViewSet, StandardFilterMixin):
|
||||
queryset = CustomFilter.objects
|
||||
serializer_class = CustomFilterSerializer
|
||||
permission_classes = [CustomIsOwner & CustomTokenHasReadWriteScope]
|
||||
@@ -1342,7 +1384,7 @@ class CustomFilterViewSet(viewsets.ModelViewSet, StandardFilterMixin):
|
||||
return super().get_queryset()
|
||||
|
||||
|
||||
class AccessTokenViewSet(viewsets.ModelViewSet):
|
||||
class AccessTokenViewSet(LoggingMixin, viewsets.ModelViewSet):
|
||||
queryset = AccessToken.objects
|
||||
serializer_class = AccessTokenSerializer
|
||||
permission_classes = [CustomIsOwner & CustomTokenHasReadWriteScope]
|
||||
@@ -1458,16 +1500,16 @@ class RecipeUrlImportView(APIView):
|
||||
data = "<script type='application/ld+json'>" + json.dumps(data_json) + "</script>"
|
||||
except JSONDecodeError:
|
||||
pass
|
||||
scrape = scrape_html(html=data, org_url=url, supported_only=False)
|
||||
scrape = scrape_html(html=data, org_url='https://urlnotfound.none', supported_only=False)
|
||||
if not url and (found_url := scrape.schema.data.get('url', 'https://urlnotfound.none')):
|
||||
scrape = scrape_html(text=data, url=found_url, supported_only=False)
|
||||
scrape = scrape_html(html=data, org_url=found_url, supported_only=False)
|
||||
|
||||
if scrape:
|
||||
return Response({
|
||||
'recipe_json': helper.get_from_scraper(scrape, request),
|
||||
'recipe_images': list(dict.fromkeys(get_images_from_soup(scrape.soup, url))),
|
||||
},
|
||||
status=status.HTTP_200_OK)
|
||||
status=status.HTTP_200_OK)
|
||||
|
||||
else:
|
||||
return Response({'error': True, 'msg': _('No usable data could be found.')}, status=status.HTTP_400_BAD_REQUEST)
|
||||
@@ -1678,7 +1720,7 @@ def sync_all(request):
|
||||
# @schema(AutoSchema()) #TODO add proper schema
|
||||
@permission_classes([CustomIsUser & CustomTokenHasReadWriteScope])
|
||||
def share_link(request, pk):
|
||||
if request.space.allow_sharing and has_group_permission(request.user, ('user', )):
|
||||
if request.space.allow_sharing and has_group_permission(request.user, ('user',)):
|
||||
recipe = get_object_or_404(Recipe, pk=pk, space=request.space)
|
||||
link = ShareLink.objects.create(recipe=recipe, created_by=request.user, space=request.space)
|
||||
return JsonResponse({'pk': pk, 'share': link.uuid, 'link': request.build_absolute_uri(reverse('view_recipe', args=[pk, link.uuid]))})
|
||||
|
||||
@@ -31,6 +31,7 @@ from cookbook.integration.recipesage import RecipeSage
|
||||
from cookbook.integration.rezeptsuitede import Rezeptsuitede
|
||||
from cookbook.integration.rezkonv import RezKonv
|
||||
from cookbook.integration.saffron import Saffron
|
||||
from cookbook.integration.gourmet import Gourmet
|
||||
from cookbook.models import ExportLog, Recipe
|
||||
from recipes import settings
|
||||
|
||||
@@ -80,6 +81,8 @@ def get_integration(request, export_type):
|
||||
return Cookmate(request, export_type)
|
||||
if export_type == ImportExportBase.REZEPTSUITEDE:
|
||||
return Rezeptsuitede(request, export_type)
|
||||
if export_type == ImportExportBase.GOURMET:
|
||||
return Gourmet(request, export_type)
|
||||
|
||||
|
||||
@group_required('user')
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
import os
|
||||
import re
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timedelta
|
||||
from io import StringIO
|
||||
from uuid import UUID
|
||||
|
||||
import redis
|
||||
from django.apps import apps
|
||||
from django.conf import settings
|
||||
from django.contrib import messages
|
||||
@@ -17,6 +18,7 @@ from django.http import HttpResponseRedirect, JsonResponse
|
||||
from django.shortcuts import get_object_or_404, redirect, render
|
||||
from django.urls import reverse, reverse_lazy
|
||||
from django.utils import timezone
|
||||
from django.utils.datetime_safe import date
|
||||
from django.utils.translation import gettext as _
|
||||
from django_scopes import scopes_disabled
|
||||
|
||||
@@ -38,7 +40,8 @@ def index(request):
|
||||
return HttpResponseRedirect(reverse_lazy('view_search'))
|
||||
|
||||
try:
|
||||
page_map = {UserPreference.SEARCH: reverse_lazy('view_search'), UserPreference.PLAN: reverse_lazy('view_plan'), UserPreference.BOOKS: reverse_lazy('view_books'), UserPreference.SHOPPING: reverse_lazy('view_shopping'),}
|
||||
page_map = {UserPreference.SEARCH: reverse_lazy('view_search'), UserPreference.PLAN: reverse_lazy('view_plan'), UserPreference.BOOKS: reverse_lazy('view_books'),
|
||||
UserPreference.SHOPPING: reverse_lazy('view_shopping'), }
|
||||
|
||||
return HttpResponseRedirect(page_map.get(request.user.userpreference.default_page))
|
||||
except UserPreference.DoesNotExist:
|
||||
@@ -160,7 +163,6 @@ def recipe_view(request, pk, share=None):
|
||||
return render(request, 'recipe_view.html', {'recipe': recipe, 'comments': comments, 'comment_form': comment_form, 'share': share, 'servings': servings})
|
||||
|
||||
|
||||
|
||||
@group_required('user')
|
||||
def books(request):
|
||||
return render(request, 'books.html', {})
|
||||
@@ -344,11 +346,48 @@ def system(request):
|
||||
for key in migration_info.keys():
|
||||
migration_info[key]['total'] = len(migration_info[key]['unapplied_migrations']) + len(migration_info[key]['applied_migrations'])
|
||||
|
||||
# API endpoint logging
|
||||
r = redis.StrictRedis(
|
||||
host=settings.REDIS_HOST,
|
||||
port=settings.REDIS_PORT,
|
||||
password='',
|
||||
username='',
|
||||
db=settings.REDIS_DATABASES['STATS'],
|
||||
)
|
||||
|
||||
api_stats = [['Endpoint', 'Total']]
|
||||
api_space_stats = [['User', 'Total']]
|
||||
total_stats = ['All', int(r.get('api:request-count'))]
|
||||
|
||||
for i in range(0, 6):
|
||||
d = (date.today() - timedelta(days=i)).isoformat()
|
||||
api_stats[0].append(d)
|
||||
api_space_stats[0].append(d)
|
||||
total_stats.append(int(r.get(f'api:request-count:{d}')) if r.get(f'api:request-count:{d}') else 0)
|
||||
|
||||
api_stats.append(total_stats)
|
||||
|
||||
for x in r.zrange('api:endpoint-request-count', 0, -1, withscores=True, desc=True):
|
||||
endpoint = x[0].decode('utf-8')
|
||||
endpoint_stats = [endpoint, x[1]]
|
||||
for i in range(0, 6):
|
||||
d = (date.today() - timedelta(days=i)).isoformat()
|
||||
endpoint_stats.append(r.zscore(f'api:endpoint-request-count:{d}', endpoint))
|
||||
api_stats.append(endpoint_stats)
|
||||
|
||||
for x in r.zrange('api:space-request-count', 0, 20, withscores=True, desc=True):
|
||||
s = x[0].decode('utf-8')
|
||||
space_stats = [Space.objects.get(pk=s).name, x[1]]
|
||||
for i in range(0, 6):
|
||||
d = (date.today() - timedelta(days=i)).isoformat()
|
||||
space_stats.append(r.zscore(f'api:space-request-count:{d}', s))
|
||||
api_space_stats.append(space_stats)
|
||||
|
||||
return render(
|
||||
request, 'system.html', {
|
||||
'gunicorn_media': settings.GUNICORN_MEDIA, 'debug': settings.DEBUG, 'postgres': postgres, 'postgres_version': postgres_ver, 'postgres_status': database_status,
|
||||
'postgres_message': database_message, 'version_info': VERSION_INFO, 'plugins': PLUGINS, 'secret_key': secret_key, 'orphans': orphans, 'migration_info': migration_info,
|
||||
'missing_migration': missing_migration, 'allowed_hosts': settings.ALLOWED_HOSTS,
|
||||
'missing_migration': missing_migration, 'allowed_hosts': settings.ALLOWED_HOSTS, 'api_stats': api_stats, 'api_space_stats': api_space_stats
|
||||
})
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
This application features a very versatile import and export feature in order
|
||||
This application features a very versatile import and export feature in order
|
||||
to offer the best experience possible and allow you to freely choose where your data goes.
|
||||
|
||||
!!! WARNING "WIP"
|
||||
@@ -12,7 +12,7 @@ Feel like there is an important integration missing? Just take a look at the [in
|
||||
if your favorite one is missing.
|
||||
|
||||
!!! info "Export"
|
||||
I strongly believe in everyone's right to use their data as they please and therefore want to give you
|
||||
I strongly believe in everyone's right to use their data as they please and therefore want to give you
|
||||
the best possible flexibility with your recipes.
|
||||
That said for most of the people getting this application running with their recipes is the biggest priority.
|
||||
Because of this importing as many formats as possible is prioritized over exporting.
|
||||
@@ -21,50 +21,55 @@ if your favorite one is missing.
|
||||
Overview of the capabilities of the different integrations.
|
||||
|
||||
| Integration | Import | Export | Images |
|
||||
|--------------------| ------ | -- | ------ |
|
||||
| Default | ✔️ | ✔️ | ✔️ |
|
||||
| Nextcloud | ✔️ | ⌚ | ✔️ |
|
||||
| Mealie | ✔️ | ⌚ | ✔️ |
|
||||
| Chowdown | ✔️ | ⌚ | ✔️ |
|
||||
| Safron | ✔️ | ✔️ | ❌ |
|
||||
| Paprika | ✔️ | ⌚ | ✔️ |
|
||||
| ChefTap | ✔️ | ❌ | ❌ |
|
||||
| Pepperplate | ✔️ | ⌚ | ❌ |
|
||||
| RecipeSage | ✔️ | ✔️ | ✔️ |
|
||||
| Rezeptsuite.de | ✔️ | ❌ | ✔️ |
|
||||
| Domestica | ✔️ | ⌚ | ✔️ |
|
||||
| MealMaster | ✔️ | ❌ | ❌ |
|
||||
| RezKonv | ✔️ | ❌ | ❌ |
|
||||
| OpenEats | ✔️ | ❌ | ⌚ |
|
||||
| Plantoeat | ✔️ | ❌ | ✔ |
|
||||
| CookBookApp | ✔️ | ⌚ | ✔️ |
|
||||
| CopyMeThat | ✔️ | ❌ | ✔️ |
|
||||
| Melarecipes | ✔️ | ⌚ | ✔️ |
|
||||
| Cookmate | ✔️ | ⌚ | ✔️ |
|
||||
| PDF (experimental) | ⌚️ | ✔️ | ✔️ |
|
||||
| ------------------ | ------ | ------ | ------ |
|
||||
| Default | ✔️ | ✔️ | ✔️ |
|
||||
| Nextcloud | ✔️ | ⌚ | ✔️ |
|
||||
| Mealie | ✔️ | ⌚ | ✔️ |
|
||||
| Chowdown | ✔️ | ⌚ | ✔️ |
|
||||
| Safron | ✔️ | ✔️ | ❌ |
|
||||
| Paprika | ✔️ | ⌚ | ✔️ |
|
||||
| ChefTap | ✔️ | ❌ | ❌ |
|
||||
| Pepperplate | ✔️ | ⌚ | ❌ |
|
||||
| RecipeSage | ✔️ | ✔️ | ✔️ |
|
||||
| Rezeptsuite.de | ✔️ | ❌ | ✔️ |
|
||||
| Domestica | ✔️ | ⌚ | ✔️ |
|
||||
| MealMaster | ✔️ | ❌ | ❌ |
|
||||
| RezKonv | ✔️ | ❌ | ❌ |
|
||||
| OpenEats | ✔️ | ❌ | ⌚ |
|
||||
| Plantoeat | ✔️ | ❌ | ✔ |
|
||||
| CookBookApp | ✔️ | ⌚ | ✔️ |
|
||||
| CopyMeThat | ✔️ | ❌ | ✔️ |
|
||||
| Melarecipes | ✔️ | ⌚ | ✔️ |
|
||||
| Cookmate | ✔️ | ⌚ | ✔️ |
|
||||
| PDF (experimental) | ⌚️ | ✔️ | ✔️ |
|
||||
| Gourmet | ✔️ | ❌ | ✔️ |
|
||||
|
||||
✔️ = implemented, ❌ = not implemented and not possible/planned, ⌚ = not yet implemented
|
||||
|
||||
## Default
|
||||
|
||||
The default integration is the built in (and preferred) way to import and export recipes.
|
||||
It is maintained with new fields added and contains all data to transfer your recipes from one installation to another.
|
||||
|
||||
It is also one of the few recipe formats that is actually structured in a way that allows for
|
||||
easy machine readability if you want to use the data for any other purpose.
|
||||
It is also one of the few recipe formats that is actually structured in a way that allows for
|
||||
easy machine readability if you want to use the data for any other purpose.
|
||||
|
||||
## RecipeSage
|
||||
Go to Settings > Export Recipe Data and select `EXPORT AS JSON-LD (BEST)`. Then simply upload the exported file
|
||||
|
||||
Go to Settings > Export Recipe Data and select `EXPORT AS JSON-LD (BEST)`. Then simply upload the exported file
|
||||
to Tandoor.
|
||||
|
||||
The RecipeSage integration also allows exporting. To migrate from Tandoor to RecipeSage simply export with Recipe Sage
|
||||
The RecipeSage integration also allows exporting. To migrate from Tandoor to RecipeSage simply export with Recipe Sage
|
||||
selected and import the json file in RecipeSage. Images are currently not supported for exporting.
|
||||
|
||||
## Domestica
|
||||
Go to Import/Export and select `Export Recipes`. Then simply upload the exported file
|
||||
|
||||
Go to Import/Export and select `Export Recipes`. Then simply upload the exported file
|
||||
to Tandoor.
|
||||
|
||||
## Nextcloud
|
||||
Importing recipes from Nextcloud cookbook is very easy and since Nextcloud Cookbook provides nice, standardized and
|
||||
|
||||
Importing recipes from Nextcloud cookbook is very easy and since Nextcloud Cookbook provides nice, standardized and
|
||||
structured information most of your recipe is going to be intact.
|
||||
|
||||
Follow these steps to import your recipes
|
||||
@@ -77,10 +82,9 @@ Follow these steps to import your recipes
|
||||
You will get a `Recipes.zip` file. Simply upload the file and choose the Nextcloud Cookbook type.
|
||||
|
||||
!!! WARNING "Folder Structure"
|
||||
Importing only works if the folder structure is correct. If you do not use the standard path or create the
|
||||
zip file in any other way make sure the structure is as follows
|
||||
```
|
||||
Recipes.zip/
|
||||
Importing only works if the folder structure is correct. If you do not use the standard path or create the
|
||||
zip file in any other way make sure the structure is as follows
|
||||
` Recipes.zip/
|
||||
└── Recipes/
|
||||
├── Recipe1/
|
||||
│ ├── recipe.json
|
||||
@@ -88,27 +92,29 @@ You will get a `Recipes.zip` file. Simply upload the file and choose the Nextclo
|
||||
└── Recipe2/
|
||||
├── recipe.json
|
||||
└── full.jpg
|
||||
```
|
||||
`
|
||||
|
||||
## Mealie
|
||||
Mealie provides structured data similar to nextcloud.
|
||||
|
||||
To migrate your recipes
|
||||
Mealie provides structured data similar to nextcloud.
|
||||
|
||||
To migrate your recipes
|
||||
|
||||
1. Go to your Mealie settings and create a new Backup.
|
||||
2. Download the backup by clicking on it and pressing download (this wasn't working for me, so I had to manually pull it from the server).
|
||||
3. Upload the entire `.zip` file to the importer page and import everything.
|
||||
|
||||
## Chowdown
|
||||
Chowdown stores all your recipes in plain text markdown files in a directory called `_recipes`.
|
||||
|
||||
Chowdown stores all your recipes in plain text markdown files in a directory called `_recipes`.
|
||||
Images are saved in a directory called `images`.
|
||||
|
||||
In order to import your Chowdown recipes simply create a `.zip` file from those two folders and import them.
|
||||
In order to import your Chowdown recipes simply create a `.zip` file from those two folders and import them.
|
||||
The folder structure should look as follows
|
||||
|
||||
!!! info "_recipes"
|
||||
For some reason chowdown uses `_` before the `recipes` folder. To avoid confusion the import supports both
|
||||
`_recipes` and `recipes`
|
||||
For some reason chowdown uses `_`before the`recipes`folder. To avoid confusion the import supports both
|
||||
`\_recipes`and`recipes`
|
||||
|
||||
```
|
||||
Recipes.zip/
|
||||
@@ -123,31 +129,35 @@ Recipes.zip/
|
||||
```
|
||||
|
||||
## Safron
|
||||
|
||||
Go to your safron settings page and export your recipes.
|
||||
Then simply upload the entire `.zip` file to the importer.
|
||||
|
||||
!!! warning "Images"
|
||||
Safron exports do not contain any images. They will be lost during import.
|
||||
Safron exports do not contain any images. They will be lost during import.
|
||||
|
||||
## Paprika
|
||||
|
||||
A Paprika export contains a folder with a html representation of your recipes and a `.paprikarecipes` file.
|
||||
|
||||
The `.paprikarecipes` file is basically just a zip with gzipped contents. Simply upload the whole file and import
|
||||
all your recipes.
|
||||
The `.paprikarecipes` file is basically just a zip with gzipped contents. Simply upload the whole file and import
|
||||
all your recipes.
|
||||
|
||||
## Pepperplate
|
||||
|
||||
Pepperplate provides a `.zip` file containing all of your recipes as `.txt` files. These files are well-structured and allow
|
||||
the import of all data without losing anything.
|
||||
|
||||
Simply export the recipes from Pepperplate and upload the zip to Tandoor. Images are not included in the export and
|
||||
Simply export the recipes from Pepperplate and upload the zip to Tandoor. Images are not included in the export and
|
||||
thus cannot be imported.
|
||||
|
||||
## ChefTap
|
||||
|
||||
ChefTaps allows you to export your recipes from the app (I think). The export is a zip file containing a folder called
|
||||
`cheftap_export` which in turn contains `.txt` files with your recipes.
|
||||
|
||||
This format is basically completely unstructured and every export looks different. This makes importing it very hard
|
||||
and leads to suboptimal results. Images are also not supported as they are not included in the export (at least
|
||||
and leads to suboptimal results. Images are also not supported as they are not included in the export (at least
|
||||
the tests I had).
|
||||
|
||||
Usually the import should recognize all ingredients and put everything else into the instructions. If your import fails
|
||||
@@ -156,31 +166,36 @@ or is worse than this feel free to provide me with more example data and I can t
|
||||
As ChefTap cannot import these files anyway there won't be an exporter implemented in Tandoor.
|
||||
|
||||
## MealMaster
|
||||
Meal master can be imported by uploading one or more meal master files.
|
||||
The files should either be `.txt`, `.MMF` or `.MM` files.
|
||||
|
||||
Meal master can be imported by uploading one or more meal master files.
|
||||
The files should either be `.txt`, `.MMF` or `.MM` files.
|
||||
|
||||
The MealMaster spec allows for many variations. Currently, only the one column format for ingredients is supported.
|
||||
Second line notes to ingredients are currently also not imported as a note but simply put into the instructions.
|
||||
If you have MealMaster recipes that cannot be imported feel free to raise an issue.
|
||||
|
||||
## RezKonv
|
||||
The RezKonv format is primarily used in the german recipe manager RezKonv Suite.
|
||||
|
||||
The RezKonv format is primarily used in the german recipe manager RezKonv Suite.
|
||||
To migrate from RezKonv Suite to Tandoor select `Export > Gesamtes Kochbuch exportieren` (the last option in the export menu).
|
||||
The generated file can simply be imported into Tandoor.
|
||||
|
||||
As I only had limited sample data feel free to open an issue if your RezKonv export cannot be imported.
|
||||
|
||||
## Recipekeeper
|
||||
Recipe keeper allows you to export a zip file containing recipes and images using its apps.
|
||||
|
||||
Recipe keeper allows you to export a zip file containing recipes and images using its apps.
|
||||
This zip file can simply be imported into Tandoor.
|
||||
|
||||
## OpenEats
|
||||
|
||||
OpenEats does not provide any way to export the data using the interface. Luckily it is relatively easy to export it from the command line.
|
||||
You need to run the command `python manage.py dumpdata recipe ingredient` inside of the application api container.
|
||||
If you followed the default installation method you can use the following command `docker-compose -f docker-prod.yml run --rm --entrypoint 'sh' api ./manage.py dumpdata recipe ingredient`.
|
||||
This command might also work `docker exec -it openeats_api_1 ./manage.py dumpdata recipe ingredient rating recipe_groups > recipe_ingredients.json`
|
||||
|
||||
Store the outputted json string in a `.json` file and simply import it using the importer. The file should look something like this
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
@@ -231,30 +246,44 @@ CookBookApp can export .zip files containing .html files. Upload the entire ZIP
|
||||
CopyMeThat can export .zip files containing an `.html` file as well as a folder containing all the images. Upload the entire ZIP to Tandoor to import all included recipes.
|
||||
|
||||
## Cookmate
|
||||
|
||||
Cookmate allows you to export a `.mcb` file which you can simply upload to tandoor and import all your recipes.
|
||||
|
||||
## RecetteTek
|
||||
RecetteTek exports are `.rtk` files which can simply be uploaded to tandoor to import all your recipes.
|
||||
|
||||
RecetteTek exports are `.rtk` files which can simply be uploaded to tandoor to import all your recipes.
|
||||
|
||||
## Rezeptsuite.de
|
||||
|
||||
Rezeptsuite.de exports are `.xml` files which can simply be uploaded to tandoor to import all your recipes.
|
||||
|
||||
It appears that Reptsuite, depending on the client, might export a `.zip` file containing a `.cml` file.
|
||||
If this happens just unzip the zip file and change `.cml` to `.xml` to import your recipes.
|
||||
If this happens just unzip the zip file and change `.cml` to `.xml` to import your recipes.
|
||||
|
||||
## Melarecipes
|
||||
|
||||
Melarecipes provides multiple export formats but only the `MelaRecipes` format can export the complete collection.
|
||||
Perform this export and open the `.melarecipes` file using your favorite archive opening program (e.g 7zip).
|
||||
Perform this export and open the `.melarecipes` file using your favorite archive opening program (e.g 7zip).
|
||||
Repeat this if the file contains another `.melarecipes` file until you get a list of one or many `.melarecipe` files.
|
||||
Upload all `.melarecipe` files you want to import to tandoor and start the import.
|
||||
|
||||
## PDF
|
||||
|
||||
The PDF Exporter is an experimental feature that uses the puppeteer browser renderer to render each recipe and export it to PDF.
|
||||
For that to work it downloads a chromium binary of about 140 MB to your server and then renders the PDF files using that.
|
||||
The PDF Exporter is an experimental feature that uses the puppeteer browser renderer to render each recipe and export it to PDF.
|
||||
For that to work it downloads a chromium binary of about 140 MB to your server and then renders the PDF files using that.
|
||||
|
||||
Since that is something some server administrators might not want there the PDF exporter is disabled by default and can be enabled with `ENABLE_PDF_EXPORT=1` in `.env`.
|
||||
|
||||
See [this issue](https://github.com/TandoorRecipes/recipes/pull/1211) for more discussion on this and
|
||||
See [this issue](https://github.com/TandoorRecipes/recipes/pull/1211) for more discussion on this and
|
||||
[this issue](https://github.com/TandoorRecipes/recipes/issues/781) for the future plans to support server side rendering.
|
||||
|
||||
## Gourmet
|
||||
|
||||
An importer for files from [Gourmet](https://github.com/thinkle/gourmet/). As the `.grmt` files appears to lack the unit for ingredients
|
||||
a file with `.zip` file with `.htm` and `.jpg`is expected.
|
||||
|
||||
To generate the file export to 'html' in Gourmet and zip the folder generated.
|
||||
|
||||
The import of menues is not supported
|
||||
|
||||
Export is not supported due to problems with `.grmt` format.
|
||||
|
||||
@@ -3,8 +3,7 @@
|
||||
These instructions are inspired from a standard django/gunicorn/postgresql instructions ([for example](https://www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-16-04))
|
||||
|
||||
!!! warning
|
||||
Be sure to use python 3.9 at least and pip related to python 3.9 at least. Depending on your distribution calling `python` or `pip` will use python2 instead of python 3.9. As of writing this documentation 3.10 is available as well.
|
||||
Make sure your machine got at least 2048 MB memory, otherwise the yarn build will fail with `FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory`.
|
||||
Make sure to use Python 3.10 or higher, and ensure that `pip` is associated with Python 3. Depending on your system configuration, using `python` or `pip` might default to Python 2. Make sure your machine has at least 2048 MB of memory; otherwise, the `yarn build` process may fail with the error: `FATAL ERROR: Reached heap limit - Allocation failed: JavaScript heap out of memory`.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
|
||||
@@ -126,6 +126,14 @@ PRIVACY_URL = os.getenv('PRIVACY_URL', '')
|
||||
IMPRINT_URL = os.getenv('IMPRINT_URL', '')
|
||||
HOSTED = bool(int(os.getenv('HOSTED', False)))
|
||||
|
||||
REDIS_HOST = os.getenv('REDIS_HOST', None)
|
||||
REDIS_PORT = int(os.getenv('REDIS_PORT', 6379))
|
||||
REDIS_USERNAME = os.getenv('REDIS_USERNAME', None)
|
||||
REDIS_PASSWORD = os.getenv('REDIS_PASSWORD', None)
|
||||
REDIS_DATABASES = {
|
||||
'STATS': 0
|
||||
}
|
||||
|
||||
MESSAGE_TAGS = {messages.ERROR: 'danger'}
|
||||
|
||||
# Application definition
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
Django==4.2.15
|
||||
cryptography===42.0.5
|
||||
Django==4.2.16
|
||||
cryptography===43.0.1
|
||||
django-annoying==0.10.6
|
||||
django-cleanup==8.0.0
|
||||
django-crispy-forms==2.1
|
||||
django-crispy-forms==2.3
|
||||
crispy-bootstrap4==2024.1
|
||||
django-tables2==2.7.0
|
||||
djangorestframework==3.15.2
|
||||
@@ -11,17 +11,17 @@ django-oauth-toolkit==2.4.0
|
||||
django-debug-toolbar==4.3.0
|
||||
bleach==6.0.0
|
||||
gunicorn==22.0.0
|
||||
lxml==5.1.0
|
||||
lxml==5.3.0
|
||||
Markdown==3.5.1
|
||||
Pillow==10.3.0
|
||||
Pillow==10.4.0
|
||||
psycopg2-binary==2.9.9
|
||||
python-dotenv==1.0.0
|
||||
requests==2.32.0
|
||||
requests==2.32.3
|
||||
six==1.16.0
|
||||
webdavclient3==3.14.6
|
||||
whitenoise==6.6.0
|
||||
whitenoise==6.7.0
|
||||
icalendar==5.0.11
|
||||
pyyaml==6.0.1
|
||||
pyyaml==6.0.2
|
||||
uritemplate==4.1.1
|
||||
beautifulsoup4==4.12.3
|
||||
microdata==0.8.0
|
||||
@@ -30,10 +30,10 @@ Jinja2==3.1.4
|
||||
django-webpack-loader==3.0.1
|
||||
git+https://github.com/BITSOLVER/django-js-reverse@071e304fd600107bc64bbde6f2491f1fe049ec82
|
||||
django-allauth==0.61.1
|
||||
recipe-scrapers==15.0.0
|
||||
recipe-scrapers==15.2.1
|
||||
django-scopes==2.0.0
|
||||
django-treebeard==4.7
|
||||
django-cors-headers==4.3.1
|
||||
django-cors-headers==4.6.0
|
||||
django-storages==1.14.2
|
||||
boto3==1.28.75
|
||||
django-prometheus==2.2.0
|
||||
@@ -44,6 +44,7 @@ pyppeteer==2.0.0
|
||||
pytube==15.0.0
|
||||
aiohttp==3.10.2
|
||||
inflection==0.5.1
|
||||
redis==5.2.0
|
||||
|
||||
# Development
|
||||
pytest==8.0.0
|
||||
@@ -54,5 +55,5 @@ pytest-html==4.1.1
|
||||
pytest-asyncio==0.23.5
|
||||
pytest-xdist==3.6.1
|
||||
autopep8==2.0.4
|
||||
flake8==6.1.0
|
||||
flake8==7.1.1
|
||||
yapf==0.40.2
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
"Calories": "Kalorien",
|
||||
"Energy": "Energie",
|
||||
"Nutrition": "Nährwerte",
|
||||
"Keywords": "Stichwörter",
|
||||
"Keywords": "Schlagwörter",
|
||||
"Books": "Kochbücher",
|
||||
"show_only_internal": "Nur interne Rezepte anzeigen",
|
||||
"Ingredients": "Zutaten",
|
||||
@@ -114,7 +114,7 @@
|
||||
"Create_New_Shopping Category": "Neue Einkaufskategorie erstellen",
|
||||
"Automate": "Automatisieren",
|
||||
"Type": "Typ",
|
||||
"and_up": "& hoch",
|
||||
"and_up": "& auf",
|
||||
"Unrated": "Unbewertet",
|
||||
"Shopping_list": "Einkaufsliste",
|
||||
"step_time_minutes": "Schritt Dauer in Minuten",
|
||||
@@ -284,7 +284,7 @@
|
||||
"copy_markdown_table": "Als Markdown-Tabelle kopieren",
|
||||
"in_shopping": "In Einkaufsliste",
|
||||
"DelayUntil": "Verzögerung bis",
|
||||
"QuickEntry": "Einfach",
|
||||
"QuickEntry": "Schnelleintrag",
|
||||
"shopping_add_onhand": "Automatisch vorrätig",
|
||||
"related_recipes": "Ähnliche Rezepte",
|
||||
"today_recipes": "Rezepte des Tages",
|
||||
@@ -358,9 +358,9 @@
|
||||
"paste_ingredients": "Zutaten einfügen",
|
||||
"Ingredient Editor": "Zutateneditor",
|
||||
"Protected": "Geschützt",
|
||||
"not": "nicht",
|
||||
"not": "kein",
|
||||
"warning_duplicate_filter": "Warnung: Wegen technischen Limitierungen können mehrere Filter der selben Kombination (und/oder/nicht) zu unerwarteten Ergebnissen führen.",
|
||||
"and_down": "& Runter",
|
||||
"and_down": "& ab",
|
||||
"enable_expert": "Expertenmodus aktivieren",
|
||||
"filter_name": "Filtername",
|
||||
"shared_with": "geteilt mit",
|
||||
@@ -415,7 +415,7 @@
|
||||
"Invites": "Einladungen",
|
||||
"Message": "Nachricht",
|
||||
"Bookmarklet": "Lesezeichen",
|
||||
"substitute_siblings_help": "Alle Lebensmittel, die sich ein übergeordnetes Lebensmittels teilen, gelten als Alternativen.",
|
||||
"substitute_siblings_help": "Alle Lebensmittel, die sich ein übergeordnetes Lebensmittel teilen, gelten als Alternativen.",
|
||||
"substitute_children": "Ersatzkinder",
|
||||
"Decimals": "Nachkommastellen",
|
||||
"Default_Unit": "Standardeinheit",
|
||||
@@ -518,7 +518,7 @@
|
||||
"show_step_ingredients_setting_help": "Fügen Sie neben den Rezeptschritten eine Zutatentabelle hinzu. Gilt zum Zeitpunkt der Erstellung. Kann in der Ansicht „Rezept bearbeiten“ überschrieben werden.",
|
||||
"show_step_ingredients": "Schritt \"Zutaten\" anzeigen",
|
||||
"hide_step_ingredients": "Schritt Zutaten ausblenden",
|
||||
"OrderInformation": "Die Objekte sind von kleinen zu großen Zahlen geordnet.",
|
||||
"OrderInformation": "Objekte werden von kleiner bis großer Anzahl geordnet.",
|
||||
"show_ingredients_table": "Zeige eine Tabelle der Zutaten neben der Schrittbeschreibung",
|
||||
"make_now_count": "Öfters fehlende Zutaten",
|
||||
"fluid_ounce": "\"Fluid Ounce\" [fl oz] (US, Volumen)",
|
||||
@@ -534,7 +534,7 @@
|
||||
"Transpose_Words": "Wörter Umwandeln",
|
||||
"Never_Unit": "Nie Einheit",
|
||||
"Unit_Replace": "Einheit Ersetzen",
|
||||
"quart": "\"Viertel\" [qt] (US, Volumen)",
|
||||
"quart": "Viertel [qt] (US, Volumen)",
|
||||
"imperial_quart": "Engl. \"Quart\" [imp qt] (UK, Volumen)",
|
||||
"err_importing_recipe": "Es trat ein Fehler auf beim importieren des Rezepts!",
|
||||
"property_type_fdc_hint": "Nur Eigenschaftstypen mit einer FDC-ID können automatisch Daten aus der FDC-Datenbank beziehen",
|
||||
@@ -570,5 +570,6 @@
|
||||
"DefaultPage": "Standardseite",
|
||||
"Shopping_input_placeholder": "z.B. Kartoffeln/ 100 Kartoffeln/ 100 g Kartoffeln",
|
||||
"Created": "Erstellt",
|
||||
"Updated": "Aktualisiert"
|
||||
"Updated": "Aktualisiert",
|
||||
"us_cup": "Tasse (US, Volumen)"
|
||||
}
|
||||
|
||||
@@ -517,5 +517,56 @@
|
||||
"imperial_gallon": "αυτοκρατορικό γαλόνι [imp gal] (Ηνωμένο Βασίλειο, όγκος)",
|
||||
"imperial_tbsp": "αυτοκρατορικό κουτάλι της σούπας [imp tbsp] (Ηνωμένο Βασίλειο, όγκος)",
|
||||
"Choose_Category": "Επιλογή κατηγορίας",
|
||||
"Back": "Πίσω"
|
||||
"Back": "Πίσω",
|
||||
"Calculator": "Υπολογιστής",
|
||||
"us_cup": "φλιτζάνι (ΗΠΑ, όγκος)",
|
||||
"Created": "Δημιουργήθηκε",
|
||||
"Logo": "Λογότυπο",
|
||||
"Nav_Text_Mode_Help": "Συμπεριφέρεται διαφορετικά για κάθε θέμα.",
|
||||
"Properties_Food_Amount": "Ιδιότητες Ποσότητα Φαγητού",
|
||||
"show_step_ingredients": "Εμφάνιση των συστατικών του βήματος",
|
||||
"make_now_count": "Το πολύ να λείπουν συστατικά",
|
||||
"Error": "Σφάλμα",
|
||||
"Nav_Text_Mode": "Λειτουγία κειμένου πλοήγησης",
|
||||
"Input": "Εισαγογή",
|
||||
"Undo": "Ανέρεση",
|
||||
"NoMoreUndo": "Δεν υπάρχουν αλλαγές για ανέρεση.",
|
||||
"Delete_All": "Διαγραφή όλων",
|
||||
"created_by": "Δημιουργήθηκε από",
|
||||
"CustomLogoHelp": "Ανεβάστε τετράγωνες εικόνες σε διαφορετικά μεγέθη για αλλαγή σε λογότυπο στην καρτέλα του προγράμματος περιήγησης και στο εγκατεστημένο Web App.",
|
||||
"CustomNavLogoHelp": "Μεταφορτώστε μια εικόνα για χρήση ως λογότυπο της γραμμής πλοήγησης.",
|
||||
"ShowRecentlyCompleted": "Πρόσφατα αντικείμενα που ολοκληρώθηκαν",
|
||||
"ShoppingBackgroundSyncWarning": "Κακό δίκτυο, αναμονή συγχρονισμού...",
|
||||
"Name_Replace": "Αντικατάσταση Ονόματος",
|
||||
"Transpose_Words": "Μεταφορά λέξεων",
|
||||
"err_importing_recipe": "Υπάρχει σφάλμα στην εισαγωγή της σύνταγης!",
|
||||
"Properties_Food_Unit": "Ιδιότητες Μονάδα Φαγητού",
|
||||
"show_step_ingredients_setting": "Εμφάνιση συστατικών δίπλα στα βήματα της συνταγής",
|
||||
"show_step_ingredients_setting_help": "Προσθέστε τον πίνακα συστατικών δίπλα στα βήματα της συνταγής. Ισχύει κατά τη δημιουργία. Μπορεί να παρακαμφθεί στην προβολή επεξεργασίας συνταγής.",
|
||||
"hide_step_ingredients": "Απόκρυψη των συστατικών του βήματος",
|
||||
"property_type_fdc_hint": "Μόνο οι τύποι ιδιοτήτων με ταυτότητα FDC, μπορούν να τραβήξουν αυτόματα δεδομένα απο την βάση δεδομένων του FDC",
|
||||
"FDC_Search": "Αναζήτηση FDC",
|
||||
"StartDate": "Ημερομηνία Έναρξης",
|
||||
"CustomImageHelp": "Ανεβάστε μια εικόνα για να εμφανίζεται στην επισκόπηση χώρου",
|
||||
"CustomThemeHelp": "Αντικαταστήστε τα στυλ του επιλεγμένου θέματος μεταφορτώνοντας ένα προσαρμοσμένο αρχείο CSS.",
|
||||
"CustomTheme": "Προσαρμοσμένο Θέμα",
|
||||
"Shopping_input_placeholder": "π.χ. Πατάτα/100 Πατάτες/100 γρ Πατατες",
|
||||
"Property_Editor": "Επεξεργαστής Ιδιοτήτων",
|
||||
"CustomLogos": "Προσαρμοσμένα λογότυπα",
|
||||
"Updated": "Επεξεργάστηκε",
|
||||
"Unchanged": "Αμετάβλητο",
|
||||
"Show_Logo": "Εμφάνιση λογότυπου",
|
||||
"Show_Logo_Help": "Εμφάνιση λογότυπου του Tandoor ή του space στη γραμμή πλοήγησης.",
|
||||
"Space_Cosmetic_Settings": "Ορισμένες ρυθμίσεις εμφάνισης μπορούν να αλλάξουν από τους διαχειριστές του χώρου και θα παρακάμψουν τις ρυθμίσεις πελάτη για αυτόν τον χώρο.",
|
||||
"show_ingredients_table": "Εμφάνιση ένός πίνακα με τα συστατικά δίπλα στο κείμενο του βήματος",
|
||||
"Enable": "Ενεργοποίηση",
|
||||
"Alignment": "Ευθυγράμμιση",
|
||||
"FDC_ID_help": "Ταυτότητα βάσης δεδομένων FDC",
|
||||
"EndDate": "Ημερομηνία Λήξης",
|
||||
"FDC_ID": "Ταυτότητα FDC",
|
||||
"OrderInformation": "Τα αντικείμενα ταξινομούνται από μικρό σε μεγάλο αριθμό.",
|
||||
"Never_Unit": "Ποτέ Μονάδα",
|
||||
"DefaultPage": "Προεπιλεγμένη σελίδα",
|
||||
"Food_Replace": "Αντικατάσταση Φαγητού",
|
||||
"Unit_Replace": "Αντικατάσταση Μονάδας"
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
"Log_Recipe_Cooking": "Registro de recetas",
|
||||
"External_Recipe_Image": "Imagen externa de la receta",
|
||||
"Add_to_Shopping": "Añadir a la cesta",
|
||||
"Add_to_Plan": "Añadir a regimen",
|
||||
"Add_to_Plan": "Añadir al plan",
|
||||
"Step_start_time": "Hora de inicio",
|
||||
"Sort_by_new": "Ordenar por novedades",
|
||||
"Table_of_Contents": "Tabla de contenido",
|
||||
@@ -34,15 +34,15 @@
|
||||
"Add_nutrition_recipe": "Añadir nutricion a la canasta",
|
||||
"Remove_nutrition_recipe": "Borrar nutrición de la canasta",
|
||||
"Copy_template_reference": "Copiar patrón",
|
||||
"Save_and_View": "Grabar y mostrar",
|
||||
"Manage_Books": "Manejar libros",
|
||||
"Meal_Plan": "Régimen de comida",
|
||||
"Save_and_View": "Guardar y mostrar",
|
||||
"Manage_Books": "Gestionar libros",
|
||||
"Meal_Plan": "Plan de comidas",
|
||||
"Select_Book": "Seleccionar libro",
|
||||
"Select_File": "Seleccionar archivo",
|
||||
"Recipe_Image": "Imagen de la receta",
|
||||
"Import_finished": "Importación finalizada",
|
||||
"View_Recipes": "Mostrar recetas",
|
||||
"Log_Cooking": "Registrar Cocinada",
|
||||
"Log_Cooking": "Registrar cocinada",
|
||||
"New_Recipe": "Nueva receta",
|
||||
"Url_Import": "Importar desde url",
|
||||
"Reset_Search": "Resetear busqueda",
|
||||
@@ -95,9 +95,9 @@
|
||||
"Categories": "categorias",
|
||||
"Category": "Categoría",
|
||||
"Selected": "Selecionado",
|
||||
"min": "minimo",
|
||||
"min": "Mínimo",
|
||||
"Servings": "Raciones",
|
||||
"Waiting": "esperando",
|
||||
"Waiting": "Esperando",
|
||||
"Preparation": "Preparación",
|
||||
"External": "Externo",
|
||||
"Size": "Tamaño",
|
||||
@@ -187,8 +187,8 @@
|
||||
"FoodOnHand": "Ya tienes {food} comprado.",
|
||||
"FoodNotOnHand": "No tienes {food} comprado.",
|
||||
"Undefined": "Indefinido",
|
||||
"Create_Meal_Plan_Entry": "Crear entrada del régimen de comidas",
|
||||
"Edit_Meal_Plan_Entry": "Eliminar entrada del régimen de comidas",
|
||||
"Create_Meal_Plan_Entry": "Crear entrada del plan de comidas",
|
||||
"Edit_Meal_Plan_Entry": "Eliminar entrada del plan de comidas",
|
||||
"Title": "Titulo",
|
||||
"Week": "Semana",
|
||||
"Month": "Mes",
|
||||
@@ -374,7 +374,7 @@
|
||||
"Ratings": "Calificaciones",
|
||||
"Internal": "Interno",
|
||||
"Units": "Unidades",
|
||||
"Random Recipes": "Recetas Aleatorias",
|
||||
"Random Recipes": "Recetas aleatorias",
|
||||
"parameter_count": "Parámetro {count}",
|
||||
"select_keyword": "Seleccionar Palabra Clave",
|
||||
"add_keyword": "Añadir Palabra Clave",
|
||||
@@ -505,7 +505,7 @@
|
||||
"Combine_All_Steps": "Combinar todos los pasos en un solo campo.",
|
||||
"imperial_pint": "Pinta imperial [imp pt] (Reino Unido, volumen)",
|
||||
"Shopping_input_placeholder": "e.g. Patata/100 Patatas/100 g Patatas",
|
||||
"Property_Editor": "Editor de Propiedades",
|
||||
"Property_Editor": "Editor de propiedades",
|
||||
"Conversion": "Conversión",
|
||||
"created_by": "Creado por",
|
||||
"CustomLogoHelp": "Subir imágenes cuadradas de diferentes tamaños para cambiarlas a logotipo en la pestaña del navegador y en la aplicación web instalada.",
|
||||
|
||||
@@ -8,11 +8,11 @@
|
||||
"err_moving_resource": "Hiba történt egy erőforrás áthelyezésekor!",
|
||||
"err_merging_resource": "Hiba történt egy erőforrás egyesítésekor!",
|
||||
"success_fetching_resource": "Sikeresen lekérdezett erőforrást!",
|
||||
"success_creating_resource": "",
|
||||
"success_updating_resource": "",
|
||||
"success_deleting_resource": "",
|
||||
"success_moving_resource": "",
|
||||
"success_merging_resource": "",
|
||||
"success_creating_resource": "Sikeresen létrehoztam egy erőforrást!",
|
||||
"success_updating_resource": "Sikeresen frissítettem egy erőforrást!",
|
||||
"success_deleting_resource": "Sikeresen töröltem egy erőforrást!",
|
||||
"success_moving_resource": "Sikeresen áthelyeztem egy erőforrást!",
|
||||
"success_merging_resource": "Sikeresen egyesítettem egy erőforrást!",
|
||||
"file_upload_disabled": "A fájlfeltöltés nincs engedélyezve az Ön teréhez.",
|
||||
"step_time_minutes": "Lépés időtartama percben",
|
||||
"confirm_delete": "Biztos, hogy törölni akarja ezt a {object}?",
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
"err_fetching_resource": "Si è verificato un errore durante il recupero di una risorsa!",
|
||||
"err_creating_resource": "Si è verificato un errore durante la creazione di una risorsa!",
|
||||
"err_updating_resource": "Si è verificato un errore durante l'aggiornamento di una risorsa!",
|
||||
"err_deleting_resource": "Si è verificato un errore durante la cancellazione di una risorsa!",
|
||||
"err_deleting_resource": "Si è verificato un errore durante l'eliminazione di una risorsa!",
|
||||
"success_fetching_resource": "Risorsa recuperata con successo!",
|
||||
"success_creating_resource": "Risorsa creata con successo!",
|
||||
"success_updating_resource": "Risorsa aggiornata con successo!",
|
||||
"success_deleting_resource": "Risorsa eliminata con successo!",
|
||||
"import_running": "Importazione in corso, attendere prego!",
|
||||
"import_running": "Importazione in corso, attendere!",
|
||||
"all_fields_optional": "Tutti i campi sono opzionali e possono essere lasciati vuoti.",
|
||||
"convert_internal": "Converti come ricetta interna",
|
||||
"show_only_internal": "Mostra solo ricette interne",
|
||||
@@ -15,29 +15,29 @@
|
||||
"Log_Recipe_Cooking": "Aggiungi a ricette cucinate",
|
||||
"External_Recipe_Image": "Immagine ricetta esterna",
|
||||
"Add_to_Shopping": "Aggiunti agli acquisti",
|
||||
"Add_to_Plan": "Aggiungi a Piano",
|
||||
"Step_start_time": "Ora di inizio dello Step",
|
||||
"Add_to_Plan": "Aggiungi a piano",
|
||||
"Step_start_time": "Ora di inizio dello step",
|
||||
"Sort_by_new": "Prima i nuovi",
|
||||
"Recipes_per_page": "Ricette per pagina",
|
||||
"Manage_Books": "Gestisci Libri",
|
||||
"Manage_Books": "Gestisci libri",
|
||||
"Meal_Plan": "Piano alimentare",
|
||||
"Select_Book": "Seleziona Libro",
|
||||
"Select_Book": "Seleziona libro",
|
||||
"Recipe_Image": "Immagine ricetta",
|
||||
"Import_finished": "Importazione completata",
|
||||
"View_Recipes": "Mostra ricette",
|
||||
"Log_Cooking": "Registro ricette cucinate",
|
||||
"New_Recipe": "Nuova Ricetta",
|
||||
"New_Recipe": "Nuova ricetta",
|
||||
"Url_Import": "Importa da URL",
|
||||
"Reset_Search": "Ripristina Ricerca",
|
||||
"Reset_Search": "Ripristina ricerca",
|
||||
"Recently_Viewed": "Visualizzato di recente",
|
||||
"Load_More": "Carica di più",
|
||||
"Load_More": "Carica altro",
|
||||
"New_Keyword": "Nuova parola chiave",
|
||||
"Delete_Keyword": "Elimina parola chiave",
|
||||
"Edit_Keyword": "Modifica parola chiave",
|
||||
"Move_Keyword": "Sposta parola chiave",
|
||||
"Merge_Keyword": "Unisci parola chiave",
|
||||
"Hide_Keywords": "Nascondi parola chiave",
|
||||
"Hide_Recipes": "Nascondi Ricette",
|
||||
"Hide_Recipes": "Nascondi ricette",
|
||||
"Keywords": "Parole chiave",
|
||||
"Books": "Libri",
|
||||
"Proteins": "Proteine",
|
||||
@@ -53,7 +53,7 @@
|
||||
"Rating": "Valutazione",
|
||||
"Close": "Chiudi",
|
||||
"Cancel": "Annulla",
|
||||
"Link": "Link",
|
||||
"Link": "Collegamento",
|
||||
"Add": "Aggiungi",
|
||||
"New": "Nuovo",
|
||||
"Success": "Riuscito",
|
||||
@@ -96,15 +96,15 @@
|
||||
"move_confirmation": "Sposta <i>{child}</i> al primario <i>{parent}</i>",
|
||||
"merge_confirmation": "Sostituisci <i>{source}</i> con <i>{target}</i>",
|
||||
"move_selection": "Scegli un primario {type} dove spostare {source}.",
|
||||
"merge_selection": "Sostituisci tutte le voci di {source} con il {type} selezionato.",
|
||||
"merge_selection": "Sostituisci tutte le occorrenze di {source} con {type} selezionato.",
|
||||
"Root": "Radice",
|
||||
"Ignore_Shopping": "Ignora spesa",
|
||||
"delete_confirmation": "Sei sicuro di voler eliminare {source}?",
|
||||
"Description": "Descrizione",
|
||||
"Icon": "Icona",
|
||||
"Unit": "Unità di misura",
|
||||
"Unit": "Unità",
|
||||
"No_ID": "ID non trovato, non è possibile eliminare.",
|
||||
"Recipe_Book": "Libro di Ricette",
|
||||
"Recipe_Book": "Libro di ricette",
|
||||
"create_title": "Nuovo {type}",
|
||||
"edit_title": "Modifica {type}",
|
||||
"Name": "Nome",
|
||||
@@ -122,10 +122,10 @@
|
||||
"merge_title": "Unisci {type}",
|
||||
"Key_Shift": "Maiusc",
|
||||
"del_confirmation_tree": "Sei sicuro di voler eliminare {source} e tutti gli elementi dipendenti?",
|
||||
"Disable_Amount": "Disabilita Quantità",
|
||||
"Disable_Amount": "Disabilita quantità",
|
||||
"Key_Ctrl": "Ctrl",
|
||||
"No_Results": "Nessun risultato",
|
||||
"Create_New_Shopping Category": "Crea nuova categoria della spesa",
|
||||
"Create_New_Shopping Category": "Crea nuova categoria di spesa",
|
||||
"Create_New_Keyword": "Aggiungi nuova parola chiave",
|
||||
"and_up": "& Su",
|
||||
"step_time_minutes": "Tempo dello step in minuti",
|
||||
@@ -133,23 +133,23 @@
|
||||
"Show_as_header": "Mostra come intestazione",
|
||||
"Hide_as_header": "Nascondi come intestazione",
|
||||
"Copy_template_reference": "Copia riferimento template",
|
||||
"Save_and_View": "Salva & Mostra",
|
||||
"Save_and_View": "Salva e mostra",
|
||||
"Text": "Testo",
|
||||
"Edit_Recipe": "Modifica Ricetta",
|
||||
"Move_Up": "Sposta Sopra",
|
||||
"Move_Down": "Sposta Sotto",
|
||||
"Step_Name": "Nome dello Step",
|
||||
"Step_Type": "Tipo di Step",
|
||||
"Enable_Amount": "Abilita Quantità",
|
||||
"Add_Step": "Aggiungi Step",
|
||||
"Edit_Recipe": "Modifica ricetta",
|
||||
"Move_Up": "Sposta sopra",
|
||||
"Move_Down": "Sposta sotto",
|
||||
"Step_Name": "Nome dello step",
|
||||
"Step_Type": "Tipo di step",
|
||||
"Enable_Amount": "Abilita quantità",
|
||||
"Add_Step": "Aggiungi step",
|
||||
"Note": "Nota",
|
||||
"Create_New_Food": "Aggiungi nuovo alimento",
|
||||
"Make_Header": "Crea Intestazione",
|
||||
"Make_Ingredient": "Crea Ingrediente",
|
||||
"Make_Header": "Crea intestazione",
|
||||
"Make_Ingredient": "Crea ingrediente",
|
||||
"Create_New_Unit": "Aggiungi nuova unità",
|
||||
"Instructions": "Istruzioni",
|
||||
"Time": "Tempo",
|
||||
"Shopping_Category": "Categoria Spesa",
|
||||
"Shopping_Category": "Categoria spesa",
|
||||
"Meal_Plan_Days": "Piani alimentari futuri",
|
||||
"tree_root": "Radice dell'albero",
|
||||
"Automation": "Automazione",
|
||||
@@ -158,11 +158,11 @@
|
||||
"Automate": "Automatizza",
|
||||
"create_rule": "e crea automazione",
|
||||
"Empty": "Vuoto",
|
||||
"Food_Alias": "Alias Alimento",
|
||||
"Unit_Alias": "Alias Unità",
|
||||
"Keyword_Alias": "Alias Parola Chiave",
|
||||
"Food_Alias": "Alias alimento",
|
||||
"Unit_Alias": "Alias unità",
|
||||
"Keyword_Alias": "Alias parola chiave",
|
||||
"Table_of_Contents": "Indice dei contenuti",
|
||||
"warning_feature_beta": "Questa funzione è attualmente in BETA (non è completa). Potrebbero verificarsi delle anomalie e modifiche che in futuro potrebbero bloccare la funzionalità stessa o rimuove i dati correlati ad essa.",
|
||||
"warning_feature_beta": "Questa funzione è attualmente in BETA (fase di test). Potrebbero verificarsi delle anomalie e modifiche che in futuro potrebbero bloccare la funzionalità stessa o rimuove i dati correlati ad essa.",
|
||||
"Shopping_list": "Lista della spesa",
|
||||
"Title": "Titolo",
|
||||
"Create_New_Meal_Type": "Aggiungi nuovo tipo di pasto",
|
||||
@@ -188,7 +188,7 @@
|
||||
"New_Meal_Type": "Nuovo tipo di pasto",
|
||||
"Select_File": "Seleziona file",
|
||||
"Image": "Immagine",
|
||||
"Export_As_ICal": "Esporta il periodo attuale in formato .iCal",
|
||||
"Export_As_ICal": "Esporta il periodo attuale in formato iCal",
|
||||
"Week_Numbers": "Numeri della settimana",
|
||||
"Show_Week_Numbers": "Mostra numeri della settimana?",
|
||||
"file_upload_disabled": "Il caricamento dei file non è abilitato in questa istanza.",
|
||||
@@ -202,12 +202,12 @@
|
||||
"Previous_Day": "Giorno precedente",
|
||||
"Add_nutrition_recipe": "Aggiungi nutrienti alla ricetta",
|
||||
"Remove_nutrition_recipe": "Elimina nutrienti dalla ricetta",
|
||||
"Coming_Soon": "In-Arrivo",
|
||||
"Coming_Soon": "In arrivo",
|
||||
"Auto_Planner": "Pianificazione automatica",
|
||||
"New_Cookbook": "Nuovo libro di ricette",
|
||||
"Hide_Keyword": "Nascondi parole chiave",
|
||||
"Clear": "Pulisci",
|
||||
"Shopping_List_Empty": "La tua lista della spesa è vuota, puoi aggiungere elementi dal menù contestuale di una voce nel piano alimentare (clicca con il tasto destro sulla scheda o clicca con il tasto sinistro sull'icona del menù)",
|
||||
"Shopping_List_Empty": "La tua lista della spesa è vuota, puoi aggiungere elementi dal menù contestuale di una voce nel piano alimentare (fai clic con il tasto destro sulla scheda o fai clic con il tasto sinistro sull'icona del menù)",
|
||||
"success_moving_resource": "Risorsa spostata con successo!",
|
||||
"Shopping_Categories": "Categorie di spesa",
|
||||
"IngredientInShopping": "Questo ingrediente è nella tua lista della spesa.",
|
||||
@@ -236,7 +236,7 @@
|
||||
"Completed": "Completato",
|
||||
"shopping_share": "Condividi lista della spesa",
|
||||
"shopping_auto_sync": "Sincronizzazione automatica",
|
||||
"err_move_self": "Non è possibile muovere un elemento in sé stesso",
|
||||
"err_move_self": "Non è possibile spostare un elemento in sé stesso",
|
||||
"nothing": "Nulla da fare",
|
||||
"show_sql": "Mostra SQL",
|
||||
"Search Settings": "Impostazioni di ricerca",
|
||||
@@ -256,8 +256,8 @@
|
||||
"Use_Fractions_Help": "Converti automaticamente i decimali in frazioni quando apri una ricetta.",
|
||||
"Language": "Lingua",
|
||||
"Theme": "Tema",
|
||||
"SupermarketCategoriesOnly": "Solo categorie supermercati",
|
||||
"CountMore": "...più +{count}",
|
||||
"SupermarketCategoriesOnly": "Solo categorie di supermercati",
|
||||
"CountMore": "...+{count} in più",
|
||||
"IgnoreThis": "Non aggiungere mai {food} alla spesa",
|
||||
"InheritWarning": "{food} è impostato per ereditare, i cambiamenti potrebbero non essere applicati.",
|
||||
"mealplan_autoadd_shopping": "Aggiungi automaticamente al piano alimentare",
|
||||
@@ -277,7 +277,7 @@
|
||||
"Copy Token": "Copia token",
|
||||
"mealplan_autoinclude_related": "Aggiungi ricette correlate",
|
||||
"default_delay": "Ore di ritardo predefinite",
|
||||
"shopping_share_desc": "Gli utenti vedranno tutti gli elementi che aggiungi alla tua lista della spesa Per poter vedere gli elementi della loro lista, loro dovranno aggiungerti.",
|
||||
"shopping_share_desc": "Gli utenti vedranno tutti gli elementi che aggiungi alla tua lista della spesa. Per poter vedere gli elementi della loro lista, loro dovranno aggiungerti.",
|
||||
"mealplan_autoexclude_onhand_desc": "Quando aggiungi un piano alimentare alla lista della spesa (manualmente o automaticamente), escludi gli ingredienti che sono già disponibili.",
|
||||
"default_delay_desc": "Il numero predefinito di ore per ritardare l'inserimento di una lista della spesa.",
|
||||
"filter_to_supermarket": "Filtra per supermercato",
|
||||
@@ -322,20 +322,20 @@
|
||||
"Custom Filter": "Filtro personalizzato",
|
||||
"shared_with": "Condiviso con",
|
||||
"sort_by": "Ordina per",
|
||||
"Ingredient Overview": "Panoramica Ingredienti",
|
||||
"Ingredient Overview": "Panoramica ingredienti",
|
||||
"show_units": "Mostra unità di misura",
|
||||
"select_unit": "Seleziona unità di misura",
|
||||
"Ingredient Editor": "Editor Ingredienti",
|
||||
"Ingredient Editor": "Editor degli ingredienti",
|
||||
"Private_Recipe": "Ricetta privata",
|
||||
"Private_Recipe_Help": "La ricetta viene mostrata solo a te e a chi l'hai condivisa.",
|
||||
"Protected": "Protetto",
|
||||
"Copy Link": "Copia link",
|
||||
"Copy Link": "Copia collegamento",
|
||||
"Create_New_Shopping_Category": "Aggiungi nuova categoria di spesa",
|
||||
"and_down": "& Giù",
|
||||
"OnHand": "Attualmente disponibili",
|
||||
"New_Entry": "Nuova voce",
|
||||
"Use_Fractions": "Usa frazioni",
|
||||
"FoodInherit": "Campi ereditabili dagli Alimenti",
|
||||
"FoodInherit": "Campi ereditabili dagli alimenti",
|
||||
"one_url_per_line": "Un indirizzo per riga",
|
||||
"mealplan_autoexclude_onhand": "Escludi alimenti disponibili",
|
||||
"mealplan_autoadd_shopping_desc": "Aggiungi automaticamente gli ingredienti del piano alimentare alla lista della spesa.",
|
||||
@@ -353,10 +353,10 @@
|
||||
"Use_Plural_Food_Always": "Usa sempre il plurale per gli alimenti",
|
||||
"Use_Plural_Food_Simple": "Usa dinamicamente il plurale per gli alimenti",
|
||||
"plural_usage_info": "Usa il plurale per le unità di misura e gli alimenti messi qui.",
|
||||
"reusable_help_text": "Il link di invito dovrebbe essere usabile per più di un utente.",
|
||||
"reusable_help_text": "Il collegamento di invito dovrebbe essere usabile per più di un utente.",
|
||||
"empty_list": "La lista è vuota.",
|
||||
"no_pinned_recipes": "Non hai ricette fissate!",
|
||||
"recipe_name": "Nome Ricetta",
|
||||
"recipe_name": "Nome ricetta",
|
||||
"advanced_search_settings": "Impostazioni avanzate di ricerca",
|
||||
"search_no_recipes": "Non sono state trovate ricette!",
|
||||
"SubstituteOnHand": "Hai un sostituto disponibile.",
|
||||
@@ -371,7 +371,7 @@
|
||||
"add_keyword": "Aggiungi parola chiave",
|
||||
"Export_Not_Yet_Supported": "Esportazione non ancora supportata",
|
||||
"Import_Result_Info": "{imported} di {total} ricette sono state importate",
|
||||
"Recipes_In_Import": "Rocette nel tuo file di importazione",
|
||||
"Recipes_In_Import": "Ricette nel tuo file di importazione",
|
||||
"Toggle": "Attiva/Disattiva",
|
||||
"Import_Not_Yet_Supported": "Importazione non ancora supportata",
|
||||
"Are_You_Sure": "Sei sicuro?",
|
||||
@@ -386,7 +386,7 @@
|
||||
"CategoryInstruction": "Trascina le categorie per cambiare l'ordine in cui appaiono nella lista della spesa.",
|
||||
"show_sortby": "Mostra Ordina per",
|
||||
"Page": "Pagina",
|
||||
"Auto_Sort": "Ordinamento Automatico",
|
||||
"Auto_Sort": "Ordinamento automatico",
|
||||
"date_created": "Data di creazione",
|
||||
"times_cooked": "Cucinato N volte",
|
||||
"recipe_filter": "Filtro ricette",
|
||||
@@ -403,10 +403,10 @@
|
||||
"Nav_Color_Help": "Cambia il colore di navigazione.",
|
||||
"Use_Kj": "Usa kJ invece di kcal",
|
||||
"Comments_setting": "Mostra commenti",
|
||||
"click_image_import": "Clicca sull'immagine che vuoi importare per questa ricetta",
|
||||
"click_image_import": "Fai clic sull'immagine che vuoi importare per questa ricetta",
|
||||
"no_more_images_found": "Non sono state trovate altre immagini sul sito web.",
|
||||
"Click_To_Edit": "Clicca per modificare",
|
||||
"search_import_help_text": "Importa una ricetta da un sito web o da una applicazione.",
|
||||
"Click_To_Edit": "Fai clic per modificare",
|
||||
"search_import_help_text": "Importa una ricetta da un sito web o da un'applicazione.",
|
||||
"Bookmarklet": "Segnalibro",
|
||||
"paste_json": "Incolla qui il codice sorgente html o json per caricare la ricetta.",
|
||||
"Imported_From": "Importato da",
|
||||
@@ -414,7 +414,7 @@
|
||||
"Imported": "Importato",
|
||||
"Quick actions": "Azioni rapide",
|
||||
"Internal": "Interno",
|
||||
"ingredient_list": "Lista Ingredienti",
|
||||
"ingredient_list": "Lista ingredienti",
|
||||
"show_ingredient_overview": "Mostra la lista degli ingredienti all'inizio della ricetta.",
|
||||
"Change_Password": "Cambia password",
|
||||
"Social_Authentication": "Autenticazione social",
|
||||
@@ -467,11 +467,108 @@
|
||||
"make_now": "Fai ora",
|
||||
"Amount": "Quantità",
|
||||
"show_step_ingredients_setting": "Mostra gli ingredienti vicino ai passaggi della ricetta",
|
||||
"substitute_siblings_help": "Tutti gli alimenti che condividono un genitore di questo alimento sono considerati sostituti",
|
||||
"reset_children": "Reimposta l'eredità degli eredi",
|
||||
"substitute_siblings": "Sostituire prodotti eredi",
|
||||
"ChildInheritFields": "Gli eredi ereditano i valori",
|
||||
"substitute_siblings_help": "Tutti gli alimenti che condividono un genitore di questo alimento sono considerati sostituti.",
|
||||
"reset_children": "Ripristina l'eredità degli eredi",
|
||||
"substitute_siblings": "Sostituisci relativi",
|
||||
"ChildInheritFields": "Figli ereditano i campi",
|
||||
"recipe_property_info": "Puoi anche aggiungere proprietà ai cibi per calcolarli automaticamente in base alla tua ricetta!",
|
||||
"err_importing_recipe": "Si è verificato un errore durante l'importazione della ricetta!",
|
||||
"per_serving": "per porzioni"
|
||||
"per_serving": "per porzioni",
|
||||
"open_data_help_text": "Il progetto Tandoor Open Data presenta i dati forniti dalla comunità per Tandoor. Questo campo viene riempito automaticamente al momento dell'importazione e consente aggiornamenti in futuro.",
|
||||
"Open_Data_Import": "Importazione Open Data",
|
||||
"imperial_fluid_ounce": "oncia liquida imperiale [imp fl oz] (UK, volume)",
|
||||
"imperial_pint": "pinta imperiale [imp pt] (UK, volume)",
|
||||
"imperial_gallon": "gallone imperiale [imp gal] (UK, volume)",
|
||||
"imperial_tbsp": "cucchiaio da tavola imperiale [imp tbsp] (UK, volume)",
|
||||
"Create Recipe": "Crea ricetta",
|
||||
"Properties": "Proprietà",
|
||||
"Created": "Creata",
|
||||
"imperial_quart": "quarto imperiale [imp qt] (UK, volume)",
|
||||
"us_cup": "tazza (US, volume)",
|
||||
"Data_Import_Info": "Arricchisci la tua istanza importando un elenco di alimenti, unità e altro ancora, curato dalla comunità, per migliorare la tua raccolta di ricette.",
|
||||
"CustomLogoHelp": "Carica immagini quadrate di diverse dimensioni da trasformare in logo nella scheda del browser e nell'applicazione web installata.",
|
||||
"show_step_ingredients_setting_help": "Aggiungi la tabella degli ingredienti accanto ai passaggi della ricetta. Si applica al momento della creazione. Può essere sovrascritto nella vista di modifica della ricetta.",
|
||||
"Show_Logo_Help": "Mostra il logo di Tandoor o dell'istanza nella barra di navigazione.",
|
||||
"Space_Cosmetic_Settings": "Alcune impostazioni cosmetiche possono essere modificate dagli amministratori dell'istanza e sovrascriveranno le impostazioni client per quell'istanza.",
|
||||
"reset_food_inheritance": "Ripristina ereditarietà",
|
||||
"Update_Existing_Data": "Aggiorna i dati esistenti",
|
||||
"converted_amount": "Quantità convertita",
|
||||
"ounce": "oncia [oz] (peso)",
|
||||
"fluid_ounce": "oncia liquida [fl oz] (US, volume)",
|
||||
"gallon": "gallone [gal] (US, volume)",
|
||||
"Use_Metric": "Usa unità metriche",
|
||||
"Undo": "Annulla",
|
||||
"NoMoreUndo": "Nessuna modifica da annullare.",
|
||||
"show_step_ingredients": "Mostra ingredienti dello step",
|
||||
"hide_step_ingredients": "Nascondi gli ingredienti dello step",
|
||||
"Logo": "Logo",
|
||||
"Show_Logo": "Mostra logo",
|
||||
"substitute_help": "Quando si cercano ricette che possono essere realizzate con ingredienti a disposizione, si prendono in considerazione anche i sostituti.",
|
||||
"pound": "libbra (peso)",
|
||||
"ml": "millilitro [ml] (metrico, volume)",
|
||||
"kg": "chilogrammo [kg] (metrico, peso)",
|
||||
"g": "grammo [g] (metrico, peso)",
|
||||
"Back": "Indietro",
|
||||
"Properties_Food_Amount": "Proprietà Quantità alimento",
|
||||
"Properties_Food_Unit": "Proprietà Unità alimento",
|
||||
"total": "totale",
|
||||
"Welcome": "Benvenuto",
|
||||
"CustomTheme": "Tema personalizzato",
|
||||
"CustomThemeHelp": "Sostituisci gli stili del tema selezionato caricando un file CSS personalizzato.",
|
||||
"CustomImageHelp": "Carica un'immagine da mostrare nella panoramica dell'istanza.",
|
||||
"Shopping_input_placeholder": "ad es. patata/100 patate/100 g patate",
|
||||
"Property": "Proprietà",
|
||||
"Property_Editor": "Editor delle proprietà",
|
||||
"Conversion": "Conversione",
|
||||
"created_by": "Creato da",
|
||||
"CustomNavLogoHelp": "Carica un'immagine da utilizzare come logo della barra di navigazione.",
|
||||
"CustomLogos": "Loghi personalizzati",
|
||||
"ShowRecentlyCompleted": "Mostra gli elementi completati di recente",
|
||||
"ShoppingBackgroundSyncWarning": "Rete scadente, in attesa di sincronizzazione...",
|
||||
"OrderInformation": "Gli oggetti sono ordinati dal numero più piccolo al più grande.",
|
||||
"Updated": "Aggiornata",
|
||||
"Unchanged": "Non modificata",
|
||||
"Error": "Errore",
|
||||
"Nav_Text_Mode_Help": "Si comporta in modo diverso per ogni tema.",
|
||||
"Number of Objects": "Numero di oggetti",
|
||||
"StartDate": "Data d'inizio",
|
||||
"EndDate": "Data di fine",
|
||||
"Datatype": "Tipo di dato",
|
||||
"substitute_children_help": "Tutti gli alimenti derivati da questo alimento sono considerati sostituti.",
|
||||
"Enable": "Abilita",
|
||||
"Transpose_Words": "Trasponi parole",
|
||||
"imperial_tsp": "cucchiaio da tè imperiale [imp tsp] (UK, volume)",
|
||||
"Choose_Category": "Scegli categoria",
|
||||
"Import Recipe": "Importa ricetta",
|
||||
"Food_Replace": "Sostituisci alimento",
|
||||
"Name_Replace": "Sostituisci nome",
|
||||
"Unit_Replace": "Sostituisci unità",
|
||||
"Alignment": "Allineamento",
|
||||
"Learn_More": "Scopri altro",
|
||||
"converted_unit": "Unità convertita",
|
||||
"base_unit": "Unità base",
|
||||
"base_amount": "Quantità base",
|
||||
"Calculator": "Calcolatore",
|
||||
"Delete_All": "Elimina tutti",
|
||||
"DefaultPage": "Pagina predefinita",
|
||||
"tsp": "cucchiaio da tè [tsp] (US, volume)",
|
||||
"l": "litro [l] (metrico, volume)",
|
||||
"pint": "pinta [pt] (US, volume)",
|
||||
"quart": "quarto [qt] (US, volume)",
|
||||
"tbsp": "cucchiaio da tavola [tbsp] (US, volume)",
|
||||
"reset_children_help": "Sovrascrivi tutti i figli con valori da campi ereditati. I campi ereditati dei figli saranno impostati su Eredita i campi a meno che Figli ereditano i campi non sia impostato.",
|
||||
"reset_food_inheritance_info": "Ripristina tutti gli alimenti ai campi ereditati predefiniti e ai rispettivi valori padre.",
|
||||
"substitute_children": "Sostituisci figli",
|
||||
"Input": "Immissione",
|
||||
"show_ingredients_table": "Visualizza una tabella degli ingredienti accanto al testo dello step",
|
||||
"Open_Data_Slug": "Open Data Slug",
|
||||
"make_now_count": "Per lo più ingredienti mancanti",
|
||||
"Nav_Text_Mode": "Modalità di navigazione testo",
|
||||
"FDC_ID": "FDC ID",
|
||||
"FDC_ID_help": "ID database FDC",
|
||||
"ChildInheritFields_help": "In modo predefinito, i figli erediteranno questi campi.",
|
||||
"InheritFields_help": "I valori di questi campi saranno ereditati dal genitore (eccezione: le categorie di acquisto vuote non vengono ereditate)",
|
||||
"Never_Unit": "Mai unità",
|
||||
"FDC_Search": "Ricerca FDC",
|
||||
"property_type_fdc_hint": "Solo le proprietà con un ID FDC possono essere aggiornate automaticamente dal database FDC"
|
||||
}
|
||||
|
||||
572
vue/src/locales/lv.json
Normal file
572
vue/src/locales/lv.json
Normal file
@@ -0,0 +1,572 @@
|
||||
{
|
||||
"warning_feature_beta": "Šī funkcionalitāte šobrīd ir BETA (testēšanā). To izmantojot ir iespējamas kļūdas gan šobrīd, gan nākotnē (iespējams ar funkcionalitāti saistīto datu zudums).",
|
||||
"err_fetching_resource": "Ir notikusi kļūda datu saņemšanas laikā!",
|
||||
"err_creating_resource": "Ir notikusi kļūda izveidojot resursu!",
|
||||
"err_updating_resource": "Ir notikusi kļūda mainot resursu!",
|
||||
"err_deleting_resource": "Ir notikusi kļūda dzēšot resursu!",
|
||||
"err_deleting_protected_resource": "Objekts, kuru Jūs mēģinat dzēst, vēlarvien tiek izmantots un to nevar izdzēst.",
|
||||
"err_moving_resource": "Notika kļūda pārvietojot resursu!",
|
||||
"err_merging_resource": "Notika kļūda apvienojot resursu!",
|
||||
"err_importing_recipe": "Notika kļūda importējot recepti!",
|
||||
"success_fetching_resource": "Resurss veiksmīgi saņemts!",
|
||||
"success_creating_resource": "Resurss veiksmīgi izveidots!",
|
||||
"success_updating_resource": "Resurss veiksmīgi labots!",
|
||||
"success_deleting_resource": "Resurss veiksmīgi izdzēsts!",
|
||||
"success_moving_resource": "Resurss veiksmīgi pārvietots!",
|
||||
"success_merging_resource": "Resurss veiksmīgi apvienots!",
|
||||
"file_upload_disabled": "Failu ielāde šajā vietnē nav iespējota.",
|
||||
"recipe_property_info": "",
|
||||
"warning_space_delete": "",
|
||||
"food_inherit_info": "",
|
||||
"step_time_minutes": "",
|
||||
"confirm_delete": "",
|
||||
"import_running": "",
|
||||
"all_fields_optional": "",
|
||||
"convert_internal": "",
|
||||
"show_only_internal": "",
|
||||
"show_split_screen": "",
|
||||
"Log_Recipe_Cooking": "",
|
||||
"External_Recipe_Image": "",
|
||||
"Add_to_Shopping": "",
|
||||
"Add_to_Plan": "",
|
||||
"Step_start_time": "",
|
||||
"Sort_by_new": "",
|
||||
"Table_of_Contents": "",
|
||||
"Recipes_per_page": "",
|
||||
"Show_as_header": "",
|
||||
"Hide_as_header": "",
|
||||
"Add_nutrition_recipe": "",
|
||||
"Remove_nutrition_recipe": "",
|
||||
"Copy_template_reference": "",
|
||||
"per_serving": "",
|
||||
"Save_and_View": "",
|
||||
"Manage_Books": "",
|
||||
"Meal_Plan": "",
|
||||
"Select_Book": "",
|
||||
"Select_File": "",
|
||||
"Recipe_Image": "",
|
||||
"Import_finished": "",
|
||||
"View_Recipes": "",
|
||||
"Log_Cooking": "",
|
||||
"New_Recipe": "",
|
||||
"Url_Import": "",
|
||||
"Reset_Search": "",
|
||||
"Recently_Viewed": "",
|
||||
"Load_More": "",
|
||||
"New_Keyword": "",
|
||||
"Delete_Keyword": "",
|
||||
"Edit_Keyword": "",
|
||||
"Edit_Recipe": "",
|
||||
"Move_Keyword": "",
|
||||
"Merge_Keyword": "",
|
||||
"Hide_Keywords": "",
|
||||
"Hide_Recipes": "",
|
||||
"Move_Up": "",
|
||||
"Move_Down": "",
|
||||
"Step_Name": "",
|
||||
"Step_Type": "",
|
||||
"Make_Header": "",
|
||||
"Make_Ingredient": "",
|
||||
"Amount": "",
|
||||
"Enable_Amount": "",
|
||||
"Disable_Amount": "",
|
||||
"Ingredient Editor": "",
|
||||
"Description_Replace": "",
|
||||
"Instruction_Replace": "",
|
||||
"Auto_Sort": "",
|
||||
"Auto_Sort_Help": "",
|
||||
"Private_Recipe": "",
|
||||
"Private_Recipe_Help": "",
|
||||
"reusable_help_text": "",
|
||||
"open_data_help_text": "",
|
||||
"Open_Data_Slug": "",
|
||||
"Open_Data_Import": "",
|
||||
"Properties_Food_Amount": "",
|
||||
"Properties_Food_Unit": "",
|
||||
"Calculator": "",
|
||||
"FDC_ID": "",
|
||||
"FDC_Search": "",
|
||||
"FDC_ID_help": "",
|
||||
"property_type_fdc_hint": "",
|
||||
"Data_Import_Info": "",
|
||||
"Update_Existing_Data": "",
|
||||
"Use_Metric": "",
|
||||
"Learn_More": "",
|
||||
"converted_unit": "",
|
||||
"converted_amount": "",
|
||||
"base_unit": "",
|
||||
"base_amount": "",
|
||||
"Datatype": "",
|
||||
"Input": "",
|
||||
"Undo": "",
|
||||
"NoMoreUndo": "",
|
||||
"Number of Objects": "",
|
||||
"Add_Step": "",
|
||||
"Keywords": "",
|
||||
"Books": "",
|
||||
"Proteins": "",
|
||||
"Fats": "",
|
||||
"Carbohydrates": "",
|
||||
"Calories": "",
|
||||
"Energy": "",
|
||||
"Nutrition": "",
|
||||
"Date": "",
|
||||
"StartDate": "",
|
||||
"EndDate": "",
|
||||
"Share": "",
|
||||
"Automation": "",
|
||||
"Parameter": "",
|
||||
"Export": "",
|
||||
"Copy": "",
|
||||
"Rating": "",
|
||||
"Close": "",
|
||||
"Cancel": "",
|
||||
"Link": "",
|
||||
"Add": "",
|
||||
"New": "",
|
||||
"Note": "",
|
||||
"Alignment": "",
|
||||
"Success": "",
|
||||
"Failure": "",
|
||||
"Protected": "",
|
||||
"Ingredients": "",
|
||||
"Supermarket": "",
|
||||
"Categories": "",
|
||||
"Category": "",
|
||||
"Selected": "",
|
||||
"min": "",
|
||||
"Servings": "",
|
||||
"Waiting": "",
|
||||
"Preparation": "",
|
||||
"External": "",
|
||||
"Size": "",
|
||||
"Files": "",
|
||||
"File": "",
|
||||
"Edit": "",
|
||||
"Image": "",
|
||||
"Delete": "",
|
||||
"Delete_All": "",
|
||||
"Open": "",
|
||||
"Ok": "",
|
||||
"Save": "",
|
||||
"Step": "",
|
||||
"Search": "",
|
||||
"Import": "",
|
||||
"Print": "",
|
||||
"Settings": "",
|
||||
"or": "",
|
||||
"and": "",
|
||||
"Information": "",
|
||||
"Download": "",
|
||||
"Create": "",
|
||||
"Search Settings": "",
|
||||
"View": "",
|
||||
"Recipes": "",
|
||||
"Welcome": "",
|
||||
"Move": "",
|
||||
"Merge": "",
|
||||
"Parent": "",
|
||||
"Copy Link": "",
|
||||
"Copy Token": "",
|
||||
"delete_confirmation": "",
|
||||
"move_confirmation": "",
|
||||
"merge_confirmation": "",
|
||||
"create_rule": "",
|
||||
"move_selection": "",
|
||||
"merge_selection": "",
|
||||
"Root": "",
|
||||
"Ignore_Shopping": "",
|
||||
"Shopping_Category": "",
|
||||
"Shopping_Categories": "",
|
||||
"Shopping_input_placeholder": "",
|
||||
"Edit_Food": "",
|
||||
"Move_Food": "",
|
||||
"New_Food": "",
|
||||
"Hide_Food": "",
|
||||
"Food_Alias": "",
|
||||
"Unit_Alias": "",
|
||||
"Keyword_Alias": "",
|
||||
"Delete_Food": "",
|
||||
"No_ID": "",
|
||||
"Meal_Plan_Days": "",
|
||||
"merge_title": "",
|
||||
"move_title": "",
|
||||
"Food": "",
|
||||
"Property": "",
|
||||
"Property_Editor": "",
|
||||
"Conversion": "",
|
||||
"Original_Text": "",
|
||||
"Recipe_Book": "",
|
||||
"del_confirmation_tree": "",
|
||||
"delete_title": "",
|
||||
"create_title": "",
|
||||
"edit_title": "",
|
||||
"Name": "",
|
||||
"Properties": "",
|
||||
"Type": "",
|
||||
"Description": "",
|
||||
"Recipe": "",
|
||||
"tree_root": "",
|
||||
"Icon": "",
|
||||
"Unit": "",
|
||||
"Decimals": "",
|
||||
"Default_Unit": "",
|
||||
"No_Results": "",
|
||||
"New_Unit": "",
|
||||
"Create_New_Shopping Category": "",
|
||||
"Create_New_Food": "",
|
||||
"Create_New_Keyword": "",
|
||||
"Create_New_Unit": "",
|
||||
"Create_New_Meal_Type": "",
|
||||
"Create_New_Shopping_Category": "",
|
||||
"and_up": "",
|
||||
"and_down": "",
|
||||
"Instructions": "",
|
||||
"Unrated": "",
|
||||
"Automate": "",
|
||||
"Empty": "",
|
||||
"Key_Ctrl": "",
|
||||
"Key_Shift": "",
|
||||
"Time": "",
|
||||
"Text": "",
|
||||
"Shopping_list": "",
|
||||
"Added_by": "",
|
||||
"Added_on": "",
|
||||
"AddToShopping": "",
|
||||
"IngredientInShopping": "",
|
||||
"NotInShopping": "",
|
||||
"OnHand": "",
|
||||
"FoodOnHand": "",
|
||||
"FoodNotOnHand": "",
|
||||
"Undefined": "",
|
||||
"Create_Meal_Plan_Entry": "",
|
||||
"Edit_Meal_Plan_Entry": "",
|
||||
"Title": "",
|
||||
"Week": "",
|
||||
"Month": "",
|
||||
"Year": "",
|
||||
"created_by": "",
|
||||
"Planner": "",
|
||||
"Planner_Settings": "",
|
||||
"Period": "",
|
||||
"Plan_Period_To_Show": "",
|
||||
"Periods": "",
|
||||
"Plan_Show_How_Many_Periods": "",
|
||||
"Starting_Day": "",
|
||||
"Meal_Types": "",
|
||||
"Meal_Type": "",
|
||||
"New_Entry": "",
|
||||
"Clone": "",
|
||||
"Drag_Here_To_Delete": "",
|
||||
"Meal_Type_Required": "",
|
||||
"Title_or_Recipe_Required": "",
|
||||
"Color": "",
|
||||
"New_Meal_Type": "",
|
||||
"Use_Fractions": "",
|
||||
"Use_Fractions_Help": "",
|
||||
"AddFoodToShopping": "",
|
||||
"RemoveFoodFromShopping": "",
|
||||
"DeleteShoppingConfirm": "",
|
||||
"IgnoredFood": "",
|
||||
"Add_Servings_to_Shopping": "",
|
||||
"Week_Numbers": "",
|
||||
"Show_Week_Numbers": "",
|
||||
"Export_As_ICal": "",
|
||||
"Export_To_ICal": "",
|
||||
"Cannot_Add_Notes_To_Shopping": "",
|
||||
"Added_To_Shopping_List": "",
|
||||
"Shopping_List_Empty": "",
|
||||
"Next_Period": "",
|
||||
"Previous_Period": "",
|
||||
"Current_Period": "",
|
||||
"Next_Day": "",
|
||||
"Previous_Day": "",
|
||||
"Inherit": "",
|
||||
"InheritFields": "",
|
||||
"FoodInherit": "",
|
||||
"ShowUncategorizedFood": "",
|
||||
"GroupBy": "",
|
||||
"Language": "",
|
||||
"Theme": "",
|
||||
"CustomTheme": "",
|
||||
"CustomThemeHelp": "",
|
||||
"CustomImageHelp": "",
|
||||
"CustomNavLogoHelp": "",
|
||||
"CustomLogoHelp": "",
|
||||
"CustomLogos": "",
|
||||
"SupermarketCategoriesOnly": "",
|
||||
"MoveCategory": "",
|
||||
"CountMore": "",
|
||||
"IgnoreThis": "",
|
||||
"DelayFor": "",
|
||||
"Warning": "",
|
||||
"NoCategory": "",
|
||||
"InheritWarning": "",
|
||||
"ShowDelayed": "",
|
||||
"ShowRecentlyCompleted": "",
|
||||
"Completed": "",
|
||||
"OfflineAlert": "",
|
||||
"ShoppingBackgroundSyncWarning": "",
|
||||
"shopping_share": "",
|
||||
"shopping_auto_sync": "",
|
||||
"one_url_per_line": "",
|
||||
"mealplan_autoadd_shopping": "",
|
||||
"mealplan_autoexclude_onhand": "",
|
||||
"mealplan_autoinclude_related": "",
|
||||
"default_delay": "",
|
||||
"plan_share_desc": "",
|
||||
"shopping_share_desc": "",
|
||||
"shopping_auto_sync_desc": "",
|
||||
"mealplan_autoadd_shopping_desc": "",
|
||||
"mealplan_autoexclude_onhand_desc": "",
|
||||
"mealplan_autoinclude_related_desc": "",
|
||||
"default_delay_desc": "",
|
||||
"filter_to_supermarket": "",
|
||||
"Coming_Soon": "",
|
||||
"Auto_Planner": "",
|
||||
"New_Cookbook": "",
|
||||
"Hide_Keyword": "",
|
||||
"Hour": "",
|
||||
"Hours": "",
|
||||
"Day": "",
|
||||
"Days": "",
|
||||
"Second": "",
|
||||
"Seconds": "",
|
||||
"Clear": "",
|
||||
"Users": "",
|
||||
"Invites": "",
|
||||
"err_move_self": "",
|
||||
"nothing": "",
|
||||
"err_merge_self": "",
|
||||
"show_sql": "",
|
||||
"filter_to_supermarket_desc": "",
|
||||
"CategoryName": "",
|
||||
"SupermarketName": "",
|
||||
"CategoryInstruction": "",
|
||||
"OrderInformation": "",
|
||||
"shopping_recent_days_desc": "",
|
||||
"shopping_recent_days": "",
|
||||
"download_pdf": "",
|
||||
"download_csv": "",
|
||||
"csv_delim_help": "",
|
||||
"csv_delim_label": "",
|
||||
"SuccessClipboard": "",
|
||||
"copy_to_clipboard": "",
|
||||
"csv_prefix_help": "",
|
||||
"csv_prefix_label": "",
|
||||
"copy_markdown_table": "",
|
||||
"in_shopping": "",
|
||||
"DelayUntil": "",
|
||||
"Pin": "",
|
||||
"Unpin": "",
|
||||
"PinnedConfirmation": "",
|
||||
"UnpinnedConfirmation": "",
|
||||
"mark_complete": "",
|
||||
"QuickEntry": "",
|
||||
"shopping_add_onhand_desc": "",
|
||||
"shopping_add_onhand": "",
|
||||
"related_recipes": "",
|
||||
"today_recipes": "",
|
||||
"sql_debug": "",
|
||||
"remember_search": "",
|
||||
"remember_hours": "",
|
||||
"tree_select": "",
|
||||
"OnHand_help": "",
|
||||
"ignore_shopping_help": "",
|
||||
"shopping_category_help": "",
|
||||
"food_recipe_help": "",
|
||||
"Foods": "",
|
||||
"Account": "",
|
||||
"Cosmetic": "",
|
||||
"API": "",
|
||||
"enable_expert": "",
|
||||
"expert_mode": "",
|
||||
"simple_mode": "",
|
||||
"advanced": "",
|
||||
"fields": "",
|
||||
"show_keywords": "",
|
||||
"show_foods": "",
|
||||
"show_books": "",
|
||||
"show_rating": "",
|
||||
"show_units": "",
|
||||
"show_filters": "",
|
||||
"not": "",
|
||||
"save_filter": "",
|
||||
"filter_name": "",
|
||||
"left_handed": "",
|
||||
"left_handed_help": "",
|
||||
"show_step_ingredients_setting": "",
|
||||
"show_step_ingredients_setting_help": "",
|
||||
"show_step_ingredients": "",
|
||||
"hide_step_ingredients": "",
|
||||
"Custom Filter": "",
|
||||
"shared_with": "",
|
||||
"sort_by": "",
|
||||
"asc": "",
|
||||
"desc": "",
|
||||
"date_viewed": "",
|
||||
"last_cooked": "",
|
||||
"times_cooked": "",
|
||||
"date_created": "",
|
||||
"show_sortby": "",
|
||||
"search_rank": "",
|
||||
"make_now": "",
|
||||
"Created": "",
|
||||
"Updated": "",
|
||||
"Unchanged": "",
|
||||
"Error": "",
|
||||
"make_now_count": "",
|
||||
"recipe_filter": "",
|
||||
"book_filter_help": "",
|
||||
"review_shopping": "",
|
||||
"view_recipe": "",
|
||||
"copy_to_new": "",
|
||||
"recipe_name": "",
|
||||
"paste_ingredients_placeholder": "",
|
||||
"paste_ingredients": "",
|
||||
"ingredient_list": "",
|
||||
"explain": "",
|
||||
"filter": "",
|
||||
"Website": "",
|
||||
"App": "",
|
||||
"Message": "",
|
||||
"Bookmarklet": "",
|
||||
"Sticky_Nav": "",
|
||||
"Sticky_Nav_Help": "",
|
||||
"Logo": "",
|
||||
"Show_Logo": "",
|
||||
"Show_Logo_Help": "",
|
||||
"Nav_Color": "",
|
||||
"Nav_Text_Mode": "",
|
||||
"Nav_Text_Mode_Help": "",
|
||||
"Nav_Color_Help": "",
|
||||
"Space_Cosmetic_Settings": "",
|
||||
"Use_Kj": "",
|
||||
"Comments_setting": "",
|
||||
"click_image_import": "",
|
||||
"no_more_images_found": "",
|
||||
"import_duplicates": "",
|
||||
"paste_json": "",
|
||||
"Click_To_Edit": "",
|
||||
"search_no_recipes": "",
|
||||
"search_import_help_text": "",
|
||||
"search_create_help_text": "",
|
||||
"warning_duplicate_filter": "",
|
||||
"reset_children": "",
|
||||
"reset_children_help": "",
|
||||
"reset_food_inheritance": "",
|
||||
"reset_food_inheritance_info": "",
|
||||
"substitute_help": "",
|
||||
"substitute_siblings_help": "",
|
||||
"substitute_children_help": "",
|
||||
"substitute_siblings": "",
|
||||
"substitute_children": "",
|
||||
"SubstituteOnHand": "",
|
||||
"ChildInheritFields": "",
|
||||
"ChildInheritFields_help": "",
|
||||
"InheritFields_help": "",
|
||||
"show_ingredients_table": "",
|
||||
"show_ingredient_overview": "",
|
||||
"Ingredient Overview": "",
|
||||
"last_viewed": "",
|
||||
"created_on": "",
|
||||
"updatedon": "",
|
||||
"Imported_From": "",
|
||||
"advanced_search_settings": "",
|
||||
"nothing_planned_today": "",
|
||||
"no_pinned_recipes": "",
|
||||
"Planned": "",
|
||||
"Pinned": "",
|
||||
"Imported": "",
|
||||
"Quick actions": "",
|
||||
"Ratings": "",
|
||||
"Internal": "",
|
||||
"Units": "",
|
||||
"Manage_Emails": "",
|
||||
"Change_Password": "",
|
||||
"Social_Authentication": "",
|
||||
"Random Recipes": "",
|
||||
"parameter_count": "",
|
||||
"select_keyword": "",
|
||||
"add_keyword": "",
|
||||
"select_file": "",
|
||||
"select_recipe": "",
|
||||
"select_unit": "",
|
||||
"select_food": "",
|
||||
"remove_selection": "",
|
||||
"empty_list": "",
|
||||
"Select": "",
|
||||
"Supermarkets": "",
|
||||
"User": "",
|
||||
"Username": "",
|
||||
"First_name": "",
|
||||
"Last_name": "",
|
||||
"Keyword": "",
|
||||
"Advanced": "",
|
||||
"Page": "",
|
||||
"DefaultPage": "",
|
||||
"Single": "",
|
||||
"Multiple": "",
|
||||
"Reset": "",
|
||||
"Disabled": "",
|
||||
"Disable": "",
|
||||
"Enable": "",
|
||||
"Options": "",
|
||||
"Create Food": "",
|
||||
"create_food_desc": "",
|
||||
"additional_options": "",
|
||||
"Importer_Help": "",
|
||||
"Documentation": "",
|
||||
"Select_App_To_Import": "",
|
||||
"Import_Supported": "",
|
||||
"Export_Supported": "",
|
||||
"Import_Not_Yet_Supported": "",
|
||||
"Export_Not_Yet_Supported": "",
|
||||
"Import_Result_Info": "",
|
||||
"Recipes_In_Import": "",
|
||||
"Toggle": "",
|
||||
"total": "",
|
||||
"Import_Error": "",
|
||||
"Warning_Delete_Supermarket_Category": "",
|
||||
"New_Supermarket": "",
|
||||
"New_Supermarket_Category": "",
|
||||
"Are_You_Sure": "",
|
||||
"Valid Until": "",
|
||||
"Split_All_Steps": "",
|
||||
"Combine_All_Steps": "",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"g": "",
|
||||
"kg": "",
|
||||
"ounce": "",
|
||||
"pound": "",
|
||||
"ml": "",
|
||||
"l": "",
|
||||
"fluid_ounce": "",
|
||||
"us_cup": "",
|
||||
"pint": "",
|
||||
"quart": "",
|
||||
"gallon": "",
|
||||
"tbsp": "",
|
||||
"tsp": "",
|
||||
"imperial_fluid_ounce": "",
|
||||
"imperial_pint": "",
|
||||
"imperial_quart": "",
|
||||
"imperial_gallon": "",
|
||||
"imperial_tbsp": "",
|
||||
"imperial_tsp": "",
|
||||
"Choose_Category": "",
|
||||
"Back": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": "",
|
||||
"Create Recipe": "",
|
||||
"Import Recipe": "",
|
||||
"Never_Unit": "",
|
||||
"Transpose_Words": "",
|
||||
"Name_Replace": "",
|
||||
"Food_Replace": "",
|
||||
"Unit_Replace": ""
|
||||
}
|
||||
@@ -2,17 +2,17 @@
|
||||
"import_running": "Er wordt geïmporteerd, even geduld!",
|
||||
"all_fields_optional": "Alle velden zijn optioneel en kunnen leeg gelaten worden.",
|
||||
"convert_internal": "Zet om naar intern recept",
|
||||
"Log_Recipe_Cooking": "Bereiding loggen",
|
||||
"Log_Recipe_Cooking": "Bereiding registreren",
|
||||
"External_Recipe_Image": "Externe Afbeelding Recept",
|
||||
"Add_to_Book": "Voeg toe aan Boek",
|
||||
"Add_to_Shopping": "Voeg toe aan Boodschappen",
|
||||
"Add_to_Plan": "Voeg toe aan Plan",
|
||||
"Step_start_time": "Starttijd stap",
|
||||
"Select_Book": "Selecteer boek",
|
||||
"Select_Book": "Selecteer kookboek",
|
||||
"Recipe_Image": "Afbeelding Recept",
|
||||
"Import_finished": "Importeren gereed",
|
||||
"View_Recipes": "Bekijk Recepten",
|
||||
"Log_Cooking": "Log Bereiding",
|
||||
"Log_Cooking": "Registreer bereiding",
|
||||
"Proteins": "Eiwitten",
|
||||
"Fats": "Vetten",
|
||||
"Carbohydrates": "Koolhydraten",
|
||||
@@ -39,7 +39,7 @@
|
||||
"Print": "Afdrukken",
|
||||
"Information": "Informatie",
|
||||
"Keywords": "Trefwoorden",
|
||||
"Books": "Boeken",
|
||||
"Books": "Kookboeken",
|
||||
"show_only_internal": "Toon alleen interne recepten",
|
||||
"New_Recipe": "Nieuw Recept",
|
||||
"Url_Import": "Importeer URL",
|
||||
@@ -76,8 +76,8 @@
|
||||
"Delete": "Verwijder",
|
||||
"Ok": "Ok",
|
||||
"Load_More": "Laad meer",
|
||||
"Manage_Books": "Beheer boeken",
|
||||
"Create": "Voeg toe",
|
||||
"Manage_Books": "Beheer kookboeken",
|
||||
"Create": "Aanmaken",
|
||||
"Failure": "Storing",
|
||||
"View": "Bekijk",
|
||||
"Recipes": "Recepten",
|
||||
@@ -172,7 +172,7 @@
|
||||
"Week": "Week",
|
||||
"Month": "Maand",
|
||||
"Color": "Kleur",
|
||||
"New_Meal_Type": "Nieuw Maaltype",
|
||||
"New_Meal_Type": "Nieuw maaltijd type",
|
||||
"Image": "Afbeelding",
|
||||
"Planner_Settings": "Planner instellingen",
|
||||
"Period": "Periode",
|
||||
@@ -180,11 +180,11 @@
|
||||
"Periods": "Periodes",
|
||||
"Plan_Show_How_Many_Periods": "Hoeveel perioden tonen",
|
||||
"Starting_Day": "Eerste dag van de week",
|
||||
"Meal_Types": "Maaltypes",
|
||||
"Meal_Type": "Maaltype",
|
||||
"Meal_Types": "Maaltijd types",
|
||||
"Meal_Type": "Maaltijd type",
|
||||
"Clone": "Kloon",
|
||||
"Drag_Here_To_Delete": "Sleep hierheen om te verwijderen",
|
||||
"Meal_Type_Required": "Maaltype is verplicht",
|
||||
"Meal_Type_Required": "Maaltijd type is verplicht",
|
||||
"Title_or_Recipe_Required": "Titel of recept selectie is verplicht",
|
||||
"Select_File": "Selecteer Bestand",
|
||||
"Year": "Jaar",
|
||||
@@ -293,7 +293,7 @@
|
||||
"fields": "Velden",
|
||||
"show_keywords": "Toon Trefwoorden",
|
||||
"show_foods": "Toon ingrediënten",
|
||||
"show_books": "Toon boeken",
|
||||
"show_books": "Toon kookboeken",
|
||||
"show_rating": "Toon waardering",
|
||||
"show_units": "Toon eenheden",
|
||||
"show_filters": "Toon filters",
|
||||
@@ -431,14 +431,14 @@
|
||||
"Second": "Seconde",
|
||||
"Seconds": "Seconden",
|
||||
"Account": "Account",
|
||||
"Cosmetic": "Cosmetisch",
|
||||
"Cosmetic": "Weergave",
|
||||
"Message": "Bericht",
|
||||
"Sticky_Nav": "Navigatie altijd zichbaar",
|
||||
"Sticky_Nav_Help": "Geef navigatiemenu altijd bovenin weer.",
|
||||
"Nav_Color": "Navigatiekleur",
|
||||
"Nav_Color_Help": "Verander de navigatiekleur.",
|
||||
"Use_Kj": "kJ gebruiken in plaats van kcal",
|
||||
"Comments_setting": "Commentaar weergeven",
|
||||
"Comments_setting": "Opmerkingen weergeven",
|
||||
"Change_Password": "Wachtwoord veranderen",
|
||||
"Social_Authentication": "Authenticeren met sociale media-account",
|
||||
"First_name": "Voornaam",
|
||||
@@ -452,7 +452,7 @@
|
||||
"Private_Recipe": "Privé Recept",
|
||||
"Copy Link": "Kopieer Link",
|
||||
"Decimals": "Decimalen",
|
||||
"Use_Fractions": "Gebruik Kommagetallen",
|
||||
"Use_Fractions": "Gebruik breuken",
|
||||
"Theme": "Thema",
|
||||
"Hour": "Uur",
|
||||
"Users": "Gebruikers",
|
||||
@@ -523,7 +523,7 @@
|
||||
"Back": "Terug",
|
||||
"err_importing_recipe": "Bij het importeren van het recept is een fout opgetreden!",
|
||||
"CustomLogoHelp": "Upload vierkante afbeeldingen in verschillende groottes om het logo in het browser tabblad en geïnstalleerde web apps aan te passen.",
|
||||
"DefaultPage": "Standaard Pagina",
|
||||
"DefaultPage": "Startpagina",
|
||||
"hide_step_ingredients": "Verberg Stap Ingrediënten",
|
||||
"CustomTheme": "Aangepast Thema",
|
||||
"CustomThemeHelp": "Overschrijf de stijl van het thema door een aangepast CSS bestand te uploaden.",
|
||||
@@ -549,15 +549,15 @@
|
||||
"ShowRecentlyCompleted": "Toon recent voltooide items",
|
||||
"ShoppingBackgroundSyncWarning": "Slecht netwerk, wachten met synchroniseren…",
|
||||
"OrderInformation": "Objecten worden van kleine naar grote nummers gesorteerd.",
|
||||
"Show_Logo": "Toon Logo",
|
||||
"Show_Logo_Help": "Toon Tandoor of ruimte logo in navigatie balk.",
|
||||
"Show_Logo": "Toon logo",
|
||||
"Show_Logo_Help": "Toon het Tandoor of 'Ruimte' logo in de navigatie balk.",
|
||||
"Created": "Gemaakt",
|
||||
"Updated": "Geüpdate",
|
||||
"Unchanged": "Ongewijzigd",
|
||||
"Error": "Fout",
|
||||
"Logo": "Logo",
|
||||
"Nav_Text_Mode": "Navigatie Tekst Mode",
|
||||
"Space_Cosmetic_Settings": "Sommige cosmetische instellingen kunnen worden gewijzigd door de administrator van de Ruimte en zullen de persoonlijk instellingen voor die Ruimte overschrijven.",
|
||||
"Nav_Text_Mode": "Navigatie tekstkleur",
|
||||
"Space_Cosmetic_Settings": "Sommige weergave instellingen kunnen worden geforceerd door de administrator van de 'Ruimte' en zullen de persoonlijke instellingen voor die 'Ruimte' overschrijven.",
|
||||
"Nav_Text_Mode_Help": "Beinvloed het uiterlijk voor ieder thema anders.",
|
||||
"show_ingredients_table": "Toon een tabel van de ingrediënten naast de stap tekst",
|
||||
"Alignment": "Afstemming",
|
||||
@@ -571,5 +571,6 @@
|
||||
"Name_Replace": "Naam Vervangen",
|
||||
"Food_Replace": "Voedingsmiddelen Vervangen",
|
||||
"Never_Unit": "Nooit Eenheid",
|
||||
"Transpose_Words": "Omzetten Woorden"
|
||||
"Transpose_Words": "Omzetten Woorden",
|
||||
"us_cup": "kopje (US, eenheid)"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"warning_feature_beta": "Данный функционал находится в стадии BETA (тестируется). Возможны баги и серьезные изменения функционала в будущем.",
|
||||
"warning_feature_beta": "Данный функционал находится в стадии бета-тестирования. Возможны баги и серьезные изменения функционала в будущем.",
|
||||
"err_fetching_resource": "Ошибка при загрузке продукта!",
|
||||
"err_creating_resource": "Ошибка при создании продукта!",
|
||||
"err_updating_resource": "Ошибка при редактировании продукта!",
|
||||
@@ -312,7 +312,7 @@
|
||||
"recipe_name": "Название рецепта",
|
||||
"view_recipe": "Посмотреть рецепт",
|
||||
"times_cooked": "Время готовки",
|
||||
"last_cooked": "Последнее приготовленое",
|
||||
"last_cooked": "Последнее приготовленное",
|
||||
"date_viewed": "Последний просмотренный",
|
||||
"Internal": "Внутренний",
|
||||
"Imported_From": "Импортировано из",
|
||||
@@ -346,5 +346,22 @@
|
||||
"food_inherit_info": "Поля для продуктов питания, которые должны наследоваться по умолчанию.",
|
||||
"warning_space_delete": "Вы можете удалить свое пространство, включая все рецепты, списки покупок, планы питания и все остальное, что вы создали. Этого нельзя отменить! Вы уверены, что хотите это сделать?",
|
||||
"Description_Replace": "Изменить описание",
|
||||
"err_importing_recipe": "Произошла ошибка при импортировании рецепта!"
|
||||
"err_importing_recipe": "Произошла ошибка при импортировании рецепта!",
|
||||
"related_recipes": "Похожие рецепты",
|
||||
"Auto_Sort_Help": "Переместить все ингредиенты на наиболее подходящий шаг.",
|
||||
"reusable_help_text": "Должна ли ссылка приглашения быть доступна для использования более чем одним пользователем?",
|
||||
"asc": "По увеличению",
|
||||
"desc": "По убыванию",
|
||||
"show_sortby": "Показать сортировку по",
|
||||
"Calculator": "Калькулятор",
|
||||
"Private_Recipe_Help": "Рецепт виден только вам и людям, с которыми им поделились.",
|
||||
"Private_Recipe": "Приватный Рецепт",
|
||||
"Auto_Sort": "Автоматическая сортировка",
|
||||
"Amount": "Количество",
|
||||
"per_serving": "за порцию",
|
||||
"Instruction_Replace": "Изменить Инструкцию",
|
||||
"recipe_property_info": "Вы также можете добавить свойства к продуктам, чтобы автоматически рассчитывать их на основе вашего рецепта!",
|
||||
"open_data_help_text": "Проект Tandoor Open Data предоставляет предоставленные сообществом данные для Tandoor. Это поле заполняется автоматически при импорте и допускает обновления в будущем.",
|
||||
"Open_Data_Import": "Открыть импорт данных",
|
||||
"property_type_fdc_hint": "Только типы свойств с FDC ID могут автоматически получать данные из базы данных FDC"
|
||||
}
|
||||
|
||||
@@ -316,5 +316,9 @@
|
||||
"converted_amount": "Pretvorjena Količina",
|
||||
"base_unit": "Osnovna Enota",
|
||||
"base_amount": "Osnovna Količina",
|
||||
"Amount": "Količina"
|
||||
"Amount": "Količina",
|
||||
"err_importing_recipe": "Pri uvozu recepta je prišlo do napake!",
|
||||
"Properties_Food_Amount": "Lastnosti Količina hrane",
|
||||
"Properties_Food_Unit": "Lastnosti Hrana Enota",
|
||||
"Calculator": "Kalkulator"
|
||||
}
|
||||
|
||||
@@ -13,14 +13,14 @@
|
||||
"show_only_internal": "仅显示内部食谱",
|
||||
"Log_Recipe_Cooking": "食谱烹饪记录",
|
||||
"External_Recipe_Image": "外部食谱图像",
|
||||
"Add_to_Shopping": "添加到购物",
|
||||
"Add_to_Shopping": "加入购物清单",
|
||||
"Add_to_Plan": "添加到计划",
|
||||
"Step_start_time": "步骤开始时间",
|
||||
"Sort_by_new": "按新旧排序",
|
||||
"Recipes_per_page": "每页食谱数量",
|
||||
"Manage_Books": "管理书籍",
|
||||
"Manage_Books": "烹饪手册管理",
|
||||
"Meal_Plan": "用餐计划",
|
||||
"Select_Book": "选择书籍",
|
||||
"Select_Book": "选择烹饪手册",
|
||||
"Recipe_Image": "食谱图像",
|
||||
"Import_finished": "导入完成",
|
||||
"View_Recipes": "查看食谱",
|
||||
@@ -31,7 +31,7 @@
|
||||
"Recently_Viewed": "最近浏览",
|
||||
"Load_More": "加载更多",
|
||||
"Keywords": "关键词",
|
||||
"Books": "书籍",
|
||||
"Books": "烹饪手册",
|
||||
"Proteins": "蛋白质",
|
||||
"Fats": "脂肪",
|
||||
"Carbohydrates": "碳水化合物",
|
||||
@@ -198,7 +198,7 @@
|
||||
"Week_Numbers": "周数",
|
||||
"Show_Week_Numbers": "显示周数?",
|
||||
"Coming_Soon": "即将到来",
|
||||
"New_Cookbook": "新烹饪书",
|
||||
"New_Cookbook": "新建烹饪手册",
|
||||
"Hide_Keyword": "隐藏关键词",
|
||||
"Export_To_ICal": "导出 .ics",
|
||||
"Added_To_Shopping_List": "添加到购物清单",
|
||||
@@ -296,7 +296,7 @@
|
||||
"Default_Unit": "默认单位",
|
||||
"Seconds": "秒",
|
||||
"and_down": "& Down",
|
||||
"ignore_shopping_help": "请不要将食物添加到购物列表中(例如水)",
|
||||
"ignore_shopping_help": "请不要将食物添加到购物清单中(例如水)",
|
||||
"Use_Fractions_Help": "查看食谱时自动将小数转换为分数。",
|
||||
"Foods": "食物",
|
||||
"Use_Fractions": "使用分数",
|
||||
@@ -323,7 +323,7 @@
|
||||
"Invites": "邀请",
|
||||
"warning_duplicate_filter": "警告:由于技术限制,使用相同组合(和/或/不)的多个筛选器可能会产生意想不到的结果。",
|
||||
"Account": "账户",
|
||||
"Cosmetic": "化妆品",
|
||||
"Cosmetic": "外观",
|
||||
"API": "API",
|
||||
"enable_expert": "启用专家模式",
|
||||
"expert_mode": "专家模式",
|
||||
@@ -331,7 +331,7 @@
|
||||
"fields": "字段",
|
||||
"show_keywords": "显示关键字",
|
||||
"show_foods": "显示食物",
|
||||
"show_books": "显示书籍",
|
||||
"show_books": "显示烹饪手册",
|
||||
"show_units": "显示单位",
|
||||
"show_filters": "显示筛选器",
|
||||
"filter_name": "筛选器名称",
|
||||
@@ -346,7 +346,7 @@
|
||||
"Click_To_Edit": "点击编辑",
|
||||
"search_no_recipes": "找不到任何食谱!",
|
||||
"search_import_help_text": "从外部网站或应用程序导入食谱。",
|
||||
"search_create_help_text": "直接在泥炉中创建新食谱。",
|
||||
"search_create_help_text": "直接在 Tandoor 中创建新食谱。",
|
||||
"reset_children": "重置子继承",
|
||||
"reset_food_inheritance": "重置继承",
|
||||
"reset_food_inheritance_info": "将所有食物重置为默认继承字段及其父值。",
|
||||
@@ -479,7 +479,7 @@
|
||||
"Auto_Sort_Help": "将所有食材移动到最恰当的步骤。",
|
||||
"Create Recipe": "创建食谱",
|
||||
"Import Recipe": "导入食谱",
|
||||
"recipe_property_info": "您也可以为食物添加属性,以便根据食谱自动计算!",
|
||||
"recipe_property_info": "您也可以为食物添加属性,以便根据您的食谱自动计算它们!",
|
||||
"per_serving": "每份",
|
||||
"converted_amount": "换算量",
|
||||
"Open_Data_Import": "开放数据导入",
|
||||
@@ -558,5 +558,16 @@
|
||||
"CustomImageHelp": "上传图片以在空间概览中显示。",
|
||||
"CustomNavLogoHelp": "上传图像以用作导航栏徽标。",
|
||||
"CustomLogoHelp": "上传不同尺寸的方形图像以更改为浏览器选项卡和安装的网络应用程序中的徽标。",
|
||||
"CustomLogos": "自定义徽标"
|
||||
"CustomLogos": "自定义徽标",
|
||||
"us_cup": "量杯(美式容量单位)",
|
||||
"Created": "已创建",
|
||||
"Shopping_input_placeholder": "例:土豆 / 100 土豆 / 100 g 土豆",
|
||||
"created_by": "创建者",
|
||||
"Updated": "已更新",
|
||||
"Unchanged": "未更改",
|
||||
"Error": "错误",
|
||||
"DefaultPage": "默认页面",
|
||||
"Transpose_Words": "字符串转置",
|
||||
"Calculator": "计算器",
|
||||
"Never_Unit": "禁用单位识别"
|
||||
}
|
||||
|
||||
@@ -23,68 +23,68 @@
|
||||
"Select_Book": "選擇書籍",
|
||||
"Recipe_Image": "食譜圖片",
|
||||
"Import_finished": "匯入完成",
|
||||
"View_Recipes": "",
|
||||
"Log_Cooking": "",
|
||||
"New_Recipe": "",
|
||||
"Url_Import": "",
|
||||
"Reset_Search": "",
|
||||
"Recently_Viewed": "",
|
||||
"Load_More": "",
|
||||
"Keywords": "",
|
||||
"Books": "",
|
||||
"Proteins": "",
|
||||
"Fats": "",
|
||||
"Carbohydrates": "",
|
||||
"Calories": "",
|
||||
"Energy": "",
|
||||
"Nutrition": "",
|
||||
"Date": "",
|
||||
"Share": "",
|
||||
"Export": "",
|
||||
"Copy": "",
|
||||
"Rating": "",
|
||||
"Close": "",
|
||||
"Link": "",
|
||||
"Add": "",
|
||||
"New": "",
|
||||
"Success": "",
|
||||
"Failure": "",
|
||||
"Ingredients": "",
|
||||
"Supermarket": "",
|
||||
"Categories": "",
|
||||
"Category": "",
|
||||
"Selected": "",
|
||||
"min": "",
|
||||
"Servings": "",
|
||||
"Waiting": "",
|
||||
"Preparation": "",
|
||||
"External": "",
|
||||
"Size": "",
|
||||
"Files": "",
|
||||
"File": "",
|
||||
"Edit": "",
|
||||
"Cancel": "",
|
||||
"Delete": "",
|
||||
"Open": "",
|
||||
"Ok": "",
|
||||
"Save": "",
|
||||
"Step": "",
|
||||
"Search": "",
|
||||
"Import": "",
|
||||
"Print": "",
|
||||
"Settings": "",
|
||||
"or": "",
|
||||
"and": "",
|
||||
"Information": "",
|
||||
"Download": "",
|
||||
"Create": "",
|
||||
"Plural": "",
|
||||
"plural_short": "",
|
||||
"Use_Plural_Unit_Always": "",
|
||||
"Use_Plural_Unit_Simple": "",
|
||||
"Use_Plural_Food_Always": "",
|
||||
"Use_Plural_Food_Simple": "",
|
||||
"plural_usage_info": "",
|
||||
"View_Recipes": "查看食譜",
|
||||
"Log_Cooking": "記錄烹飪",
|
||||
"New_Recipe": "新食譜",
|
||||
"Url_Import": "網址匯入",
|
||||
"Reset_Search": "重置搜尋",
|
||||
"Recently_Viewed": "最近瀏覽",
|
||||
"Load_More": "載入更多",
|
||||
"Keywords": "關鍵字",
|
||||
"Books": "書籍",
|
||||
"Proteins": "蛋白質",
|
||||
"Fats": "脂肪",
|
||||
"Carbohydrates": "碳水化合物",
|
||||
"Calories": "卡路里",
|
||||
"Energy": "能量",
|
||||
"Nutrition": "營養",
|
||||
"Date": "日期",
|
||||
"Share": "分享",
|
||||
"Export": "匯出",
|
||||
"Copy": "複製",
|
||||
"Rating": "評分",
|
||||
"Close": "關閉",
|
||||
"Link": "連結",
|
||||
"Add": "新增",
|
||||
"New": "新的",
|
||||
"Success": "成功",
|
||||
"Failure": "失敗",
|
||||
"Ingredients": "食材",
|
||||
"Supermarket": "超市",
|
||||
"Categories": "分類",
|
||||
"Category": "類別",
|
||||
"Selected": "已選擇",
|
||||
"min": "分鐘",
|
||||
"Servings": "份量",
|
||||
"Waiting": "等待",
|
||||
"Preparation": "準備",
|
||||
"External": "外部",
|
||||
"Size": "大小",
|
||||
"Files": "檔案",
|
||||
"File": "檔案",
|
||||
"Edit": "編輯",
|
||||
"Cancel": "取消",
|
||||
"Delete": "刪除",
|
||||
"Open": "打開",
|
||||
"Ok": "確定",
|
||||
"Save": "儲存",
|
||||
"Step": "步驟",
|
||||
"Search": "搜尋",
|
||||
"Import": "匯入",
|
||||
"Print": "列印",
|
||||
"Settings": "設定",
|
||||
"or": "或",
|
||||
"and": "和",
|
||||
"Information": "資訊",
|
||||
"Download": "下載",
|
||||
"Create": "建立",
|
||||
"Plural": "複數",
|
||||
"plural_short": "複數簡寫",
|
||||
"Use_Plural_Unit_Always": "總是使用複數單位",
|
||||
"Use_Plural_Unit_Simple": "簡單使用複數單位",
|
||||
"Use_Plural_Food_Always": "總是使用複數食物",
|
||||
"Use_Plural_Food_Simple": "簡單使用複數食物",
|
||||
"plural_usage_info": "在此空間內使用複數形式表示單位和食物。",
|
||||
"Table_of_Contents": "目錄",
|
||||
"Select_File": "選擇檔案",
|
||||
"file_upload_disabled": "您的空間未啟用檔案上傳功能。",
|
||||
@@ -107,5 +107,466 @@
|
||||
"Hide_as_header": "隱藏為標題",
|
||||
"err_importing_recipe": "匯入食譜時發生錯誤!",
|
||||
"recipe_property_info": "您也可以為食材添加屬性,以便根據您的食譜自動計算它們!",
|
||||
"Show_as_header": "顯示為標題"
|
||||
"Show_as_header": "顯示為標題",
|
||||
"Key_Ctrl": "Ctrl 鍵",
|
||||
"Recipe": "食譜",
|
||||
"Icon": "圖標",
|
||||
"Image": "圖片",
|
||||
"Import_Result_Info": "匯入結果信息",
|
||||
"Unit": "單位",
|
||||
"Merge": "合併",
|
||||
"Hide_Recipes": "隱藏食譜",
|
||||
"Recipes": "食譜",
|
||||
"Move": "移動",
|
||||
"search_create_help_text": "直接在 Tandoor 中創建新食譜。",
|
||||
"ShowDelayed": "顯示延遲",
|
||||
"and_up": "及以上",
|
||||
"mealplan_autoadd_shopping_desc": "自動將膳食計劃食材添加到購物清單中。",
|
||||
"Shopping_list": "購物清單",
|
||||
"Meal_Type": "餐類型",
|
||||
"Foods": "食物",
|
||||
"left_handed_help": "將使用左手模式優化界面顯示。",
|
||||
"Pin": "釘住",
|
||||
"us_cup": "美制杯",
|
||||
"Create Recipe": "創建食譜",
|
||||
"Import Recipe": "匯入食譜",
|
||||
"Create_New_Food": "創建新食物",
|
||||
"Week_Numbers": "週數",
|
||||
"Coming_Soon": "即將推出",
|
||||
"Auto_Planner": "自動計劃",
|
||||
"copy_to_clipboard": "複製到剪貼板",
|
||||
"Merge_Keyword": "合併關鍵字",
|
||||
"converted_unit": "轉換單位",
|
||||
"converted_amount": "轉換數量",
|
||||
"Bookmarklet": "書籤小工具",
|
||||
"ignore_shopping_help": "忽略購物幫助",
|
||||
"Meal_Plan_Days": "餐計劃天數",
|
||||
"del_confirmation_tree": "你確定要刪除 {source} 及其所有子項嗎?",
|
||||
"Empty": "空",
|
||||
"Make_Header": "設為標題",
|
||||
"review_shopping": "審查購物",
|
||||
"shopping_category_help": "超市可以按購物分類進行篩選使其與商店的內部佈局相匹配。",
|
||||
"plan_share_desc": "新的膳食計劃條目將自動與選定的用戶共享。",
|
||||
"food_recipe_help": "食物食譜幫助",
|
||||
"show_step_ingredients_setting_help": "在食譜步驟旁邊添加成分表。在創建時應用。可以在編輯配方視圖中覆蓋。",
|
||||
"show_step_ingredients": "顯示步驟食材",
|
||||
"hide_step_ingredients": "隱藏步驟食材",
|
||||
"sort_by": "排序依據",
|
||||
"search_rank": "搜索排名",
|
||||
"make_now": "立即製作",
|
||||
"New_Keyword": "新關鍵字",
|
||||
"Delete_Keyword": "刪除關鍵字",
|
||||
"Open_Data_Import": "開放數據匯入",
|
||||
"Properties_Food_Unit": "食物單位屬性",
|
||||
"property_type_fdc_hint": "屬性類型 FDC 提示",
|
||||
"Data_Import_Info": "通過導入社區精選的食物、單位等列表來增強您的空間,以提升您的食譜收藏。",
|
||||
"Update_Existing_Data": "更新現有數據",
|
||||
"Use_Metric": "使用公制",
|
||||
"Learn_More": "了解更多",
|
||||
"base_unit": "基礎單位",
|
||||
"Shopping_Category": "購物分類",
|
||||
"Unit_Alias": "單位別名",
|
||||
"Keyword_Alias": "關鍵字別名",
|
||||
"Delete_Food": "刪除食物",
|
||||
"No_ID": "未找到標識,不能刪除。",
|
||||
"merge_title": "合併標題",
|
||||
"move_title": "移動標題",
|
||||
"Property": "屬性",
|
||||
"Property_Editor": "屬性編輯器",
|
||||
"Conversion": "轉換",
|
||||
"Original_Text": "原始文本",
|
||||
"FoodNotOnHand": "你還沒有 {food}。",
|
||||
"Recipe_Book": "食譜書",
|
||||
"delete_title": "刪除標題",
|
||||
"create_title": "創建標題",
|
||||
"Properties": "屬性",
|
||||
"Type": "類型",
|
||||
"Create_New_Unit": "創建新單位",
|
||||
"Create_New_Meal_Type": "創建新餐類型",
|
||||
"and_down": "及以下",
|
||||
"Automate": "自動化",
|
||||
"Time": "時間",
|
||||
"Text": "文本",
|
||||
"OnHand": "手頭有",
|
||||
"FoodOnHand": "你手上有 {food}。",
|
||||
"Undefined": "未定義",
|
||||
"Create_Meal_Plan_Entry": "創建餐計劃條目",
|
||||
"Title": "標題",
|
||||
"Color": "顏色",
|
||||
"New_Meal_Type": "新餐類型",
|
||||
"IgnoredFood": "已忽略購買 {food}。",
|
||||
"Show_Week_Numbers": "顯示周數?",
|
||||
"Export_To_ICal": "匯出到 iCal",
|
||||
"Cannot_Add_Notes_To_Shopping": "無法添加備註到購物",
|
||||
"Added_To_Shopping_List": "已添加到購物清單",
|
||||
"Shopping_List_Empty": "購物清單空",
|
||||
"Next_Period": "下一期間",
|
||||
"Previous_Period": "上一期間",
|
||||
"InheritFields": "繼承字段",
|
||||
"FoodInherit": "食物繼承",
|
||||
"ShowUncategorizedFood": "顯示未分類食物",
|
||||
"GroupBy": "分組依據",
|
||||
"Language": "語言",
|
||||
"Theme": "主題",
|
||||
"SupermarketCategoriesOnly": "僅超市分類",
|
||||
"MoveCategory": "移動分類 ",
|
||||
"IgnoreThis": "忽略這個",
|
||||
"DelayFor": "延遲",
|
||||
"Warning": "警告",
|
||||
"NoCategory": "未選擇分類。",
|
||||
"InheritWarning": "{food} 設置為繼承, 更改可能無法保存。",
|
||||
"ShowRecentlyCompleted": "顯示最近完成",
|
||||
"Completed": "已完成",
|
||||
"ShoppingBackgroundSyncWarning": "網絡狀況不佳,正在等待進行同步……",
|
||||
"shopping_auto_sync": "購物自動同步",
|
||||
"one_url_per_line": "每行一個網址",
|
||||
"mealplan_autoadd_shopping": "餐計劃自動添加購物",
|
||||
"mealplan_autoexclude_onhand": "餐計劃自動排除手頭有的",
|
||||
"mealplan_autoinclude_related": "餐計劃自動包含相關",
|
||||
"default_delay": "默認延遲",
|
||||
"shopping_share_desc": "用戶將看到您添加到購物清單中的所有商品。他們必須添加你才能看到他們清單上的內容。",
|
||||
"shopping_auto_sync_desc": "設置為0將禁用自動同步。當查看購物列表時,該列表每隔一秒更新一次,以同步其他人可能做出的更改。在多人購物時很有用,但會使用移動數據。",
|
||||
"mealplan_autoinclude_related_desc": "將膳食計劃(手動或自動)添加到購物清單時,包括所有相關食譜。",
|
||||
"default_delay_desc": "延遲購物清單條目的默認小時數。",
|
||||
"filter_to_supermarket": "篩選到超市",
|
||||
"New_Cookbook": "新食譜書",
|
||||
"Hide_Keyword": "隱藏關鍵字",
|
||||
"Hour": "小時",
|
||||
"Hours": "小時",
|
||||
"Second": "秒",
|
||||
"Seconds": "秒",
|
||||
"Clear": "清除",
|
||||
"Users": "用戶",
|
||||
"Invites": "邀請",
|
||||
"err_move_self": "錯誤移動自己",
|
||||
"nothing": "無",
|
||||
"filter_to_supermarket_desc": "默認情況下,過濾購物清單只包括所選超市的類別。",
|
||||
"SupermarketName": "超市名稱",
|
||||
"CategoryInstruction": "拖動類別可更改出現在購物清單中的訂單類別。",
|
||||
"OrderInformation": "對象按照從小到大的順序排列。",
|
||||
"shopping_recent_days_desc": "顯示最近幾天的購物清單列表。",
|
||||
"shopping_recent_days": "購物最近天數",
|
||||
"download_pdf": "下載 PDF",
|
||||
"csv_delim_help": "用於 CSV 導出的分隔符。",
|
||||
"SuccessClipboard": "成功複製到剪貼板",
|
||||
"csv_prefix_help": "將清單複製到剪貼板時要添加的前綴。",
|
||||
"csv_prefix_label": "CSV 前綴標籤",
|
||||
"copy_markdown_table": "複製 Markdown 表格",
|
||||
"in_shopping": "在購物中",
|
||||
"DelayUntil": "延遲到",
|
||||
"Unpin": "取消釘住",
|
||||
"PinnedConfirmation": "{recipe} 已固定。",
|
||||
"UnpinnedConfirmation": "{recipe} 已取消固定。",
|
||||
"QuickEntry": "快速輸入",
|
||||
"shopping_add_onhand_desc": "在核對購物清單時,將食物標記為“入手”。",
|
||||
"shopping_add_onhand": "購物添加手頭有的",
|
||||
"related_recipes": "相關食譜",
|
||||
"today_recipes": "今天的食譜",
|
||||
"sql_debug": "SQL 調試",
|
||||
"remember_search": "記住搜索",
|
||||
"remember_hours": "記住小時",
|
||||
"OnHand_help": "食物在庫存中時,不會自動添加到購物清單中。 並且現有狀態會與購物用戶共享。",
|
||||
"Account": "賬戶",
|
||||
"Cosmetic": "外觀",
|
||||
"API": "API",
|
||||
"enable_expert": "啟用專家模式",
|
||||
"simple_mode": "簡單模式",
|
||||
"advanced": "高級",
|
||||
"show_keywords": "顯示關鍵字",
|
||||
"show_units": "顯示單位",
|
||||
"show_filters": "顯示篩選器",
|
||||
"filter_name": "篩選器名稱",
|
||||
"left_handed": "左撇子",
|
||||
"show_step_ingredients_setting": "顯示步驟食材設置",
|
||||
"Custom Filter": "自定義篩選器",
|
||||
"shared_with": "共享給",
|
||||
"show_sortby": "顯示排序依據",
|
||||
"Created": "創建",
|
||||
"Updated": "更新",
|
||||
"Unchanged": "未更改",
|
||||
"Error": "錯誤",
|
||||
"view_recipe": "查看食譜",
|
||||
"copy_to_new": "複製到新",
|
||||
"recipe_name": "食譜名稱",
|
||||
"paste_ingredients_placeholder": "在此處粘貼食材表...",
|
||||
"explain": "解釋",
|
||||
"Website": "網站",
|
||||
"Sticky_Nav": "固定導航",
|
||||
"Show_Logo": "顯示標誌",
|
||||
"Show_Logo_Help": "在導航欄中顯示 Tandoor 或空間徽標。",
|
||||
"Nav_Text_Mode": "導航文本模式",
|
||||
"Nav_Text_Mode_Help": "每個主題的行為都不同。",
|
||||
"Space_Cosmetic_Settings": "空間管理員可以更改某些裝飾設置,並將覆蓋該空間的客戶端設置。",
|
||||
"paste_json": "在此處粘貼 json 或 html 源代碼以加載食譜。",
|
||||
"Click_To_Edit": "點擊編輯",
|
||||
"search_no_recipes": "找不到任何食譜!",
|
||||
"substitute_children_help": "所有與這種食物相同子級的食物都被視作替代品。",
|
||||
"show_ingredients_table": "顯示食材表",
|
||||
"Internal": "內部",
|
||||
"Units": "單位",
|
||||
"Manage_Emails": "管理電子郵件",
|
||||
"Change_Password": "更改密碼",
|
||||
"Supermarkets": "超市",
|
||||
"Reset": "重置",
|
||||
"Are_You_Sure": "你確定嗎?",
|
||||
"Valid Until": "有效期至",
|
||||
"Split_All_Steps": "將所有行拆分為單獨的步驟。",
|
||||
"Combine_All_Steps": "將所有步驟合併到一個字段中。",
|
||||
"imperial_tsp": "英制茶匙",
|
||||
"not": "不是",
|
||||
"save_filter": "保存篩選器",
|
||||
"substitute_help": "搜索可以用現有食材製作的食譜時,會考慮替代品。",
|
||||
"ChildInheritFields": "子項繼承字段",
|
||||
"ChildInheritFields_help": "默認情況下,子項將繼承這些字段。",
|
||||
"created_on": "創建於",
|
||||
"updatedon": "更新於",
|
||||
"Imported_From": "匯入自",
|
||||
"advanced_search_settings": "高級搜索設置",
|
||||
"nothing_planned_today": "你今天沒有任何計劃!",
|
||||
"select_keyword": "選擇關鍵字",
|
||||
"Advanced": "高級",
|
||||
"Options": "選項",
|
||||
"Create Food": "創建食物",
|
||||
"Parameter": "參數",
|
||||
"Export_Supported": "支持匯出",
|
||||
"Toggle": "切換",
|
||||
"asc": "升序",
|
||||
"times_cooked": "烹飪次數",
|
||||
"Import_Error": "導入時發生錯誤。 請跳轉至頁面底部的詳細信息進行查看。",
|
||||
"Protected": "受保護",
|
||||
"Ingredient Editor": "食材編輯器",
|
||||
"move_selection": "選擇要將 {source} 移動到的父級 {type}。",
|
||||
"merge_selection": "將所有出現的 {source} 替換為 {type}。",
|
||||
"Copy Link": "複製連結",
|
||||
"Added_by": "添加者",
|
||||
"Added_on": "添加於",
|
||||
"AddToShopping": "添加到購物",
|
||||
"IngredientInShopping": "此食材已在購物清單中。",
|
||||
"NotInShopping": "購物清單中沒有 {food}。",
|
||||
"show_sql": "顯示 SQL",
|
||||
"App": "應用程式",
|
||||
"Message": "消息",
|
||||
"book_filter_help": "除手動選擇的食譜外,還包括篩選中的食譜。",
|
||||
"ingredient_list": "食材清單",
|
||||
"New_Entry": "新條目",
|
||||
"Drag_Here_To_Delete": "拖到這裡刪除",
|
||||
"Add_Servings_to_Shopping": "添加份量到購物",
|
||||
"Export_As_ICal": "匯出為 iCal",
|
||||
"Inherit": "繼承",
|
||||
"Nav_Color": "導航顏色",
|
||||
"CategoryName": "分類名稱",
|
||||
"substitute_siblings_help": "所有與這種食物相同父級的食物都被視作替代品。",
|
||||
"mark_complete": "標記完成",
|
||||
"Search Settings": "搜尋設定",
|
||||
"Nav_Color_Help": "改變導航欄顏色。",
|
||||
"date_created": "創建日期",
|
||||
"Auto_Sort": "自動排序",
|
||||
"Auto_Sort_Help": "將所有食材移動到最恰當的步驟。",
|
||||
"reusable_help_text": "邀請鏈接是否可用於多個用戶。",
|
||||
"csv_delim_label": "CSV 分隔符標籤",
|
||||
"Ignore_Shopping": "忽略購物",
|
||||
"edit_title": "編輯標題",
|
||||
"Name": "名稱",
|
||||
"Clone": "克隆",
|
||||
"shopping_share": "購物分享",
|
||||
"Day": "天",
|
||||
"desc": "降序",
|
||||
"date_viewed": "查看日期",
|
||||
"last_cooked": "最後烹飪",
|
||||
"Description_Replace": "描述替換",
|
||||
"Instruction_Replace": "指示替換",
|
||||
"create_rule": "創建規則",
|
||||
"Decimals": "小數",
|
||||
"DeleteShoppingConfirm": "確定要移除購物清單中所有 {food} 嗎?",
|
||||
"Current_Period": "當前期間",
|
||||
"Next_Day": "下一天",
|
||||
"Previous_Day": "前一天",
|
||||
"recipe_filter": "食譜篩選器",
|
||||
"Week": "週",
|
||||
"OfflineAlert": "您處於離線狀態,購物清單可能無法同步。",
|
||||
"Planner": "計劃者",
|
||||
"Meal_Types": "餐類型",
|
||||
"err_merge_self": "錯誤合併自己",
|
||||
"show_foods": "顯示食物",
|
||||
"show_books": "顯示書籍",
|
||||
"show_rating": "顯示評分",
|
||||
"Sticky_Nav_Help": "始終在屏幕頂部顯示導航菜單。",
|
||||
"Logo": "標誌",
|
||||
"Private_Recipe": "私人食譜",
|
||||
"Private_Recipe_Help": "食譜只有你和共享的人會顯示。",
|
||||
"Period": "期間",
|
||||
"Use_Kj": "使用千焦",
|
||||
"Title_or_Recipe_Required": "需要標題或食譜",
|
||||
"Comments_setting": "評論設置",
|
||||
"click_image_import": "點擊圖片匯入",
|
||||
"select_unit": "選擇單位",
|
||||
"select_food": "選擇食物",
|
||||
"import_duplicates": "為防止食譜與現有食譜同名,將被忽略。 選中此框以導入所有內容。",
|
||||
"Use_Fractions": "使用分數",
|
||||
"search_import_help_text": "從外部網站或應用程序導入食譜。",
|
||||
"expert_mode": "專家模式",
|
||||
"Create_New_Shopping_Category": "創建新購物分類",
|
||||
"Use_Fractions_Help": "查看食譜時自動將小數轉換為分數。",
|
||||
"warning_duplicate_filter": "警告:由於技術限制,使用相同組合(和/或/不)的多個篩選器可能會產生意想不到的結果。",
|
||||
"reset_children": "重置子項",
|
||||
"Username": "用戶名",
|
||||
"Step_Name": "步驟名稱",
|
||||
"Move_Down": "下移",
|
||||
"Step_Type": "步驟類型",
|
||||
"Make_Ingredient": "設為食材",
|
||||
"reset_children_help": "用繼承字段中的值覆蓋所有子項。 繼承的子字段將設置為繼承,除非它們已設置為繼承。",
|
||||
"no_more_images_found": "沒有在網站上找到其他圖片。",
|
||||
"download_csv": "下載 CSV",
|
||||
"reset_food_inheritance_info": "將所有食物重置為默認繼承字段及其父值。",
|
||||
"substitute_siblings": "替代兄弟項",
|
||||
"substitute_children": "替代子項",
|
||||
"SubstituteOnHand": "你手頭有一個替代品。",
|
||||
"InheritFields_help": "繼承字段幫助",
|
||||
"Note": "備註",
|
||||
"Alignment": "對齊",
|
||||
"merge_confirmation": "將 <i>{source}</i> 替換為 <i>{target}</i>",
|
||||
"Shopping_Categories": "購物分類",
|
||||
"Food_Alias": "食物別名",
|
||||
"Food": "食物",
|
||||
"Warning_Delete_Supermarket_Category": "刪除超市類別也會刪除與食品的所有關係。 你確定嗎?",
|
||||
"New_Supermarket": "新超市",
|
||||
"open_data_help_text": "Tandoor開放數據項目為Tandoor提供社區貢獻的數據。該字段在導入時會自動填充,並可以之後更新。",
|
||||
"Open_Data_Slug": "開放數據標籤",
|
||||
"Amount": "數量",
|
||||
"make_now_count": "立即製作次數",
|
||||
"paste_ingredients": "粘貼食材",
|
||||
"Pinned": "釘住",
|
||||
"Imported": "匯入",
|
||||
"Quick actions": "快速操作",
|
||||
"tsp": "茶匙",
|
||||
"imperial_fluid_ounce": "英制液盎司",
|
||||
"imperial_pint": "英制品脫",
|
||||
"imperial_quart": "英制夸脫",
|
||||
"imperial_gallon": "英制加侖",
|
||||
"imperial_tbsp": "英制湯匙",
|
||||
"Transpose_Words": "轉置單詞",
|
||||
"Name_Replace": "名稱替換",
|
||||
"Food_Replace": "食物替換",
|
||||
"Never_Unit": "從不使用單位",
|
||||
"Unit_Replace": "單位替換",
|
||||
"StartDate": "開始日期",
|
||||
"EndDate": "結束日期",
|
||||
"Parent": "父項",
|
||||
"View": "查看",
|
||||
"Welcome": "歡迎",
|
||||
"Copy Token": "複製令牌",
|
||||
"last_viewed": "最後查看",
|
||||
"Select": "選擇",
|
||||
"Input": "輸入",
|
||||
"Undo": "撤銷",
|
||||
"NoMoreUndo": "沒有可撤消的更改。",
|
||||
"Delete_All": "刪除全部",
|
||||
"delete_confirmation": "你確定要刪除 {source} 嗎?",
|
||||
"move_confirmation": "移動 <i>{child}</i> 到 <i>{parent}</i>",
|
||||
"Root": "根目錄",
|
||||
"Move_Food": "移動食物",
|
||||
"New_Food": "新食物",
|
||||
"Edit_Meal_Plan_Entry": "編輯餐計劃條目",
|
||||
"Month": "月",
|
||||
"Year": "年",
|
||||
"created_by": "創建者",
|
||||
"Planner_Settings": "計劃者設定",
|
||||
"Plan_Period_To_Show": "顯示計劃期間",
|
||||
"Periods": "期間",
|
||||
"Plan_Show_How_Many_Periods": "顯示多少期間",
|
||||
"Starting_Day": "開始日",
|
||||
"Meal_Type_Required": "需要餐類型",
|
||||
"AddFoodToShopping": "添加食物到購物",
|
||||
"RemoveFoodFromShopping": "從購物中移除食物",
|
||||
"Days": "天",
|
||||
"g": "克",
|
||||
"kg": "千克",
|
||||
"ounce": "盎司",
|
||||
"pound": "磅",
|
||||
"ml": "毫升",
|
||||
"Shopping_input_placeholder": "購物輸入佔位符",
|
||||
"Hide_Food": "隱藏食物",
|
||||
"tree_root": "樹根",
|
||||
"Default_Unit": "默認單位",
|
||||
"New_Unit": "新單位",
|
||||
"Create_New_Shopping Category": "創建新購物分類",
|
||||
"Create_New_Keyword": "創建新關鍵字",
|
||||
"Instructions": "指示",
|
||||
"Unrated": "未評分",
|
||||
"Key_Shift": "Shift 鍵",
|
||||
"mealplan_autoexclude_onhand_desc": "將膳食計劃添加到購物清單時(手動或自動),排除當前手頭上的食材。",
|
||||
"reset_food_inheritance": "重置食物繼承",
|
||||
"show_ingredient_overview": "在開始時顯示食譜中所有食材的列表。",
|
||||
"Ingredient Overview": "食材概覽",
|
||||
"no_pinned_recipes": "你沒有固定的食譜!",
|
||||
"Planned": "計劃",
|
||||
"Ratings": "評分",
|
||||
"Social_Authentication": "社交認證",
|
||||
"Random Recipes": "隨機食譜",
|
||||
"parameter_count": "參數計數",
|
||||
"add_keyword": "添加關鍵字",
|
||||
"select_file": "選擇文件",
|
||||
"select_recipe": "選擇食譜",
|
||||
"remove_selection": "移除選擇",
|
||||
"empty_list": "列表為空。",
|
||||
"User": "用戶",
|
||||
"First_name": "名字",
|
||||
"Last_name": "姓氏",
|
||||
"Keyword": "關鍵字",
|
||||
"Page": "頁面",
|
||||
"Single": "單一",
|
||||
"Multiple": "多個",
|
||||
"New_Supermarket_Category": "新超市分類",
|
||||
"FDC_Search": "FDC 搜尋",
|
||||
"Edit_Food": "編輯食物",
|
||||
"filter": "篩選",
|
||||
"FDC_ID": "FDC ID",
|
||||
"FDC_ID_help": "FDC ID 幫助",
|
||||
"base_amount": "基礎數量",
|
||||
"Edit_Keyword": "編輯關鍵字",
|
||||
"Edit_Recipe": "編輯食譜",
|
||||
"Move_Keyword": "移動關鍵字",
|
||||
"Hide_Keywords": "隱藏關鍵字",
|
||||
"Move_Up": "上移",
|
||||
"Enable_Amount": "啟用數量",
|
||||
"Disable_Amount": "禁用數量",
|
||||
"Properties_Food_Amount": "食物數量屬性",
|
||||
"l": "升",
|
||||
"fluid_ounce": "液盎司",
|
||||
"pint": "品脫",
|
||||
"quart": "夸脫",
|
||||
"gallon": "加侖",
|
||||
"tbsp": "湯匙",
|
||||
"Choose_Category": "選擇分類",
|
||||
"Back": "返回",
|
||||
"Import_Supported": "支持匯入",
|
||||
"DefaultPage": "默認頁面",
|
||||
"Disabled": "禁用",
|
||||
"Disable": "禁用",
|
||||
"Enable": "啟用",
|
||||
"create_food_desc": "創建食物並將其鏈接到此食譜。",
|
||||
"additional_options": "附加選項",
|
||||
"Importer_Help": "有關此進口商的更多信息和幫助:",
|
||||
"Documentation": "文檔",
|
||||
"Select_App_To_Import": "選擇應用程式匯入",
|
||||
"Import_Not_Yet_Supported": "匯入尚不支持",
|
||||
"Export_Not_Yet_Supported": "匯出尚不支持",
|
||||
"Recipes_In_Import": "匯入中的食譜",
|
||||
"total": "總計",
|
||||
"tree_select": "樹選擇",
|
||||
"CustomTheme": "自定義主題",
|
||||
"CustomThemeHelp": "通過上傳自定義 CSS 文件覆蓋所選主題的樣式。",
|
||||
"CustomImageHelp": "上傳圖片以在空間概覽中顯示。",
|
||||
"CustomNavLogoHelp": "上傳圖像以用作導航欄徽標。",
|
||||
"CustomLogoHelp": "上傳不同尺寸的方形圖像以更改為瀏覽器選項卡和安裝的網絡應用程序中的徽標。",
|
||||
"CustomLogos": "自定義標誌",
|
||||
"CountMore": "計數更多",
|
||||
"Description": "描述",
|
||||
"Calculator": "計算器",
|
||||
"Datatype": "數據類型",
|
||||
"Number of Objects": "對象數量",
|
||||
"Add_Step": "添加步驟",
|
||||
"Automation": "自動化",
|
||||
"No_Results": "無結果",
|
||||
"fields": "字段"
|
||||
}
|
||||
|
||||
@@ -22,4 +22,5 @@ export const INTEGRATIONS = [
|
||||
{id: 'REZKONV', name: "Rezkonv", import: true, export: false, help_url: 'https://docs.tandoor.dev/features/import_export/#rezkonv'},
|
||||
{id: 'SAFRON', name: "Safron", import: true, export: true, help_url: 'https://docs.tandoor.dev/features/import_export/#safron'},
|
||||
{id: 'REZEPTSUITEDE', name: "Rezeptsuite.de", import: true, export: false, help_url: 'https://docs.tandoor.dev/features/import_export/#rezeptsuitede'},
|
||||
{id: 'GOURMET', name: "Gourmet", import: true, export: false, help_url: 'https://docs.tandoor.dev/features/import_export/#gourmet'},
|
||||
]
|
||||
|
||||
@@ -5185,9 +5185,9 @@ electron-to-chromium@^1.4.477:
|
||||
integrity sha512-VTq6vjk3kCfG2qdzQRd/i9dIyVVm0dbtZIgFzrLgfB73mXDQT2HPKVRc1EoZcAVUv9XhXAu08DWqJuababdGGg==
|
||||
|
||||
elliptic@^6.5.3, elliptic@^6.5.4:
|
||||
version "6.5.4"
|
||||
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
|
||||
integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
|
||||
version "6.6.0"
|
||||
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.0.tgz#5919ec723286c1edf28685aa89261d4761afa210"
|
||||
integrity sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==
|
||||
dependencies:
|
||||
bn.js "^4.11.9"
|
||||
brorand "^1.1.0"
|
||||
|
||||
Reference in New Issue
Block a user