From ca9f66ee2448f9786efb866d2d5aa8a33c7780a4 Mon Sep 17 00:00:00 2001 From: Michael Genson <71845777+michael-genson@users.noreply.github.com> Date: Thu, 14 Dec 2023 20:26:43 -0600 Subject: [PATCH 01/68] feat: Remove OCR Support (#2838) * remove ocr package * remove tesseract * remove OCR from app * remove OCR from tests * fix docs --- .github/workflows/partial-backend.yml | 2 +- docker/Dockerfile | 2 - docs/docs/overrides/api.html | 2 +- .../Domain/Recipe/RecipeActionMenu.vue | 14 - .../RecipeOcrEditorPage.vue | 390 -------------- .../RecipeOcrEditorPageCanvas.vue | 488 ------------------ .../RecipeOcrEditorPageHelp.vue | 54 -- .../Recipe/RecipeOcrEditorPage/index.ts | 3 - .../RecipePageParts/RecipePageHeader.vue | 15 +- frontend/lib/api/client-user.ts | 5 - frontend/lib/api/types/ocr.ts | 25 - frontend/lib/api/types/recipe.ts | 1 - frontend/lib/api/user/ocr.ts | 16 - frontend/lib/api/user/recipes/recipe.ts | 10 - .../pages/g/_groupSlug/r/_slug/ocr-editor.vue | 51 -- frontend/pages/g/_groupSlug/r/create.vue | 5 - frontend/pages/g/_groupSlug/r/create/ocr.vue | 85 --- frontend/types/ocr-types.ts | 73 --- mealie/routes/__init__.py | 2 - mealie/routes/ocr/__init__.py | 7 - mealie/routes/ocr/pytesseract.py | 37 -- mealie/routes/recipe/recipe_crud_routes.py | 37 -- mealie/schema/ocr/__init__.py | 7 - mealie/schema/ocr/ocr.py | 21 - mealie/schema/recipe/recipe.py | 1 - mealie/services/ocr/__init__.py | 0 mealie/services/ocr/pytesseract.py | 56 -- poetry.lock | 41 +- pyproject.toml | 1 - tests/data/images/test-ocr.png | Bin 11513 -> 0 bytes tests/data/text/test-ocr.tsv | 73 --- tests/data/text/test-ocr.txt | 9 - .../services_tests/test_ocr_service.py | 58 --- tests/utils/api_routes/__init__.py | 8 - 34 files changed, 29 insertions(+), 1570 deletions(-) delete mode 100644 frontend/components/Domain/Recipe/RecipeOcrEditorPage/RecipeOcrEditorPage.vue delete mode 100644 frontend/components/Domain/Recipe/RecipeOcrEditorPage/RecipeOcrEditorPageParts/RecipeOcrEditorPageCanvas.vue delete mode 100644 frontend/components/Domain/Recipe/RecipeOcrEditorPage/RecipeOcrEditorPageParts/RecipeOcrEditorPageHelp.vue delete mode 100644 frontend/components/Domain/Recipe/RecipeOcrEditorPage/index.ts delete mode 100644 frontend/lib/api/types/ocr.ts delete mode 100644 frontend/lib/api/user/ocr.ts delete mode 100644 frontend/pages/g/_groupSlug/r/_slug/ocr-editor.vue delete mode 100644 frontend/pages/g/_groupSlug/r/create/ocr.vue delete mode 100644 frontend/types/ocr-types.ts delete mode 100644 mealie/routes/ocr/__init__.py delete mode 100644 mealie/routes/ocr/pytesseract.py delete mode 100644 mealie/schema/ocr/__init__.py delete mode 100644 mealie/schema/ocr/ocr.py delete mode 100644 mealie/services/ocr/__init__.py delete mode 100644 mealie/services/ocr/pytesseract.py delete mode 100644 tests/data/images/test-ocr.png delete mode 100644 tests/data/text/test-ocr.tsv delete mode 100644 tests/data/text/test-ocr.txt delete mode 100644 tests/unit_tests/services_tests/test_ocr_service.py diff --git a/.github/workflows/partial-backend.yml b/.github/workflows/partial-backend.yml index 80afa791eb6b..154d98626b51 100644 --- a/.github/workflows/partial-backend.yml +++ b/.github/workflows/partial-backend.yml @@ -67,7 +67,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update - sudo apt-get install libsasl2-dev libldap2-dev libssl-dev tesseract-ocr-all + sudo apt-get install libsasl2-dev libldap2-dev libssl-dev poetry install poetry add "psycopg2-binary==2.8.6" if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' || steps.cache-validate.outputs.cache-hit-success != 'true' diff --git a/docker/Dockerfile b/docker/Dockerfile index 9594c0faffb2..ee422ff643eb 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -50,7 +50,6 @@ RUN apt-get update \ build-essential \ libpq-dev \ libwebp-dev \ - tesseract-ocr-all \ # LDAP Dependencies libsasl2-dev libldap2-dev libssl-dev \ gnupg gnupg2 gnupg1 \ @@ -89,7 +88,6 @@ RUN apt-get update \ && apt-get install --no-install-recommends -y \ gosu \ iproute2 \ - tesseract-ocr-all \ libldap-common \ && rm -rf /var/lib/apt/lists/* diff --git a/docs/docs/overrides/api.html b/docs/docs/overrides/api.html index a54d6bf3c398..83038e2aead5 100644 --- a/docs/docs/overrides/api.html +++ b/docs/docs/overrides/api.html @@ -14,7 +14,7 @@
diff --git a/frontend/components/Domain/Recipe/RecipeActionMenu.vue b/frontend/components/Domain/Recipe/RecipeActionMenu.vue index c5b6a72e76cb..ad24e0ed8b13 100644 --- a/frontend/components/Domain/Recipe/RecipeActionMenu.vue +++ b/frontend/components/Domain/Recipe/RecipeActionMenu.vue @@ -102,7 +102,6 @@ const SAVE_EVENT = "save"; const DELETE_EVENT = "delete"; const CLOSE_EVENT = "close"; const JSON_EVENT = "json"; -const OCR_EVENT = "ocr"; export default defineComponent({ components: { RecipeContextMenu, RecipeFavoriteBadge, RecipeTimerMenu, RecipeTimelineBadge }, @@ -139,10 +138,6 @@ export default defineComponent({ type: Boolean, default: false, }, - showOcrButton: { - type: Boolean, - default: false, - }, }, setup(props, context) { const deleteDialog = ref(false); @@ -175,15 +170,6 @@ export default defineComponent({ }, ]; - if (props.showOcrButton) { - editorButtons.splice(2, 0, { - text: i18n.t("ocr-editor.ocr-editor"), - icon: $globals.icons.eye, - event: OCR_EVENT, - color: "accent", - }); - } - function emitHandler(event: string) { switch (event) { case CLOSE_EVENT: diff --git a/frontend/components/Domain/Recipe/RecipeOcrEditorPage/RecipeOcrEditorPage.vue b/frontend/components/Domain/Recipe/RecipeOcrEditorPage/RecipeOcrEditorPage.vue deleted file mode 100644 index 28b96d609696..000000000000 --- a/frontend/components/Domain/Recipe/RecipeOcrEditorPage/RecipeOcrEditorPage.vue +++ /dev/null @@ -1,390 +0,0 @@ - - - - - diff --git a/frontend/components/Domain/Recipe/RecipeOcrEditorPage/RecipeOcrEditorPageParts/RecipeOcrEditorPageCanvas.vue b/frontend/components/Domain/Recipe/RecipeOcrEditorPage/RecipeOcrEditorPageParts/RecipeOcrEditorPageCanvas.vue deleted file mode 100644 index bcba5f4fce97..000000000000 --- a/frontend/components/Domain/Recipe/RecipeOcrEditorPage/RecipeOcrEditorPageParts/RecipeOcrEditorPageCanvas.vue +++ /dev/null @@ -1,488 +0,0 @@ - - - diff --git a/frontend/components/Domain/Recipe/RecipeOcrEditorPage/RecipeOcrEditorPageParts/RecipeOcrEditorPageHelp.vue b/frontend/components/Domain/Recipe/RecipeOcrEditorPage/RecipeOcrEditorPageParts/RecipeOcrEditorPageHelp.vue deleted file mode 100644 index 39ddf6e8338f..000000000000 --- a/frontend/components/Domain/Recipe/RecipeOcrEditorPage/RecipeOcrEditorPageParts/RecipeOcrEditorPageHelp.vue +++ /dev/null @@ -1,54 +0,0 @@ - - - diff --git a/frontend/components/Domain/Recipe/RecipeOcrEditorPage/index.ts b/frontend/components/Domain/Recipe/RecipeOcrEditorPage/index.ts deleted file mode 100644 index ff8b655f3d15..000000000000 --- a/frontend/components/Domain/Recipe/RecipeOcrEditorPage/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import RecipeOcrEditorPage from "./RecipeOcrEditorPage.vue"; - -export default RecipeOcrEditorPage; diff --git a/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageHeader.vue b/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageHeader.vue index c9e4934534e0..b17cab0ca17a 100644 --- a/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageHeader.vue +++ b/frontend/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageHeader.vue @@ -50,7 +50,6 @@ :logged-in="isOwnGroup" :open="isEditMode" :recipe-id="recipe.id" - :show-ocr-button="recipe.isOcrRecipe" class="ml-auto mt-n8 pb-4" @close="setMode(PageMode.VIEW)" @json="toggleEditMode()" @@ -58,13 +57,12 @@ @save="$emit('save')" @delete="$emit('delete')" @print="printRecipe" - @ocr="goToOcrEditor" /> - - diff --git a/frontend/pages/g/_groupSlug/r/create.vue b/frontend/pages/g/_groupSlug/r/create.vue index 72463ef0ff0f..dad973528bc1 100644 --- a/frontend/pages/g/_groupSlug/r/create.vue +++ b/frontend/pages/g/_groupSlug/r/create.vue @@ -52,11 +52,6 @@ export default defineComponent({ text: i18n.tc("recipe.import-with-zip"), value: "zip", }, - { - icon: $globals.icons.fileImage, - text: i18n.tc("recipe.create-recipe-from-an-image"), - value: "ocr", - }, { icon: $globals.icons.link, text: i18n.tc("recipe.bulk-url-import"), diff --git a/frontend/pages/g/_groupSlug/r/create/ocr.vue b/frontend/pages/g/_groupSlug/r/create/ocr.vue deleted file mode 100644 index 63acd2b61243..000000000000 --- a/frontend/pages/g/_groupSlug/r/create/ocr.vue +++ /dev/null @@ -1,85 +0,0 @@ - - diff --git a/frontend/types/ocr-types.ts b/frontend/types/ocr-types.ts deleted file mode 100644 index 2b363cf239fe..000000000000 --- a/frontend/types/ocr-types.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { OcrTsvResponse } from "~/lib/api/types/ocr"; -import { Recipe } from "~/lib/api/types/recipe"; - -export type CanvasRect = { - startX: number; - startY: number; - w: number; - h: number; -}; - -export type ImagePosition = { - sx: number; - sy: number; - sWidth: number; - sHeight: number; - dx: number; - dy: number; - dWidth: number; - dHeight: number; - scale: number; - panStartPoint: { - x: number; - y: number; - }; -}; - -export type Mouse = { - current: { - x: number; - y: number; - }; - down: boolean; -}; - -// https://stackoverflow.com/questions/58434389/export typescript-deep-keyof-of-a-nested-object/58436959#58436959 -type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...0[]]; - -type Join = K extends string | number - ? P extends string | number - ? `${K}${"" extends P ? "" : "."}${P}` - : never - : never; - -export type Leaves = [D] extends [never] - ? never - : T extends object - ? { [K in keyof T]-?: Join> }[keyof T] - : ""; - -export type Paths = [D] extends [never] - ? never - : T extends object - ? { - [K in keyof T]-?: K extends string | number ? `${K}` | Join> : never; - }[keyof T] - : ""; - -export type SelectedRecipeLeaves = Leaves; - -export type CanvasModes = "selection" | "panAndZoom"; - -export type SelectedTextSplitModes = keyof OcrTsvResponse | "flatten"; - -export type ToolbarIcons = { - sectionTitle: string; - eventHandler(mode: T): void; - highlight: T; - icons: { - name: T; - icon: string; - tooltip: string; - }[]; -}[]; diff --git a/mealie/routes/__init__.py b/mealie/routes/__init__.py index e421c01ae5ab..849ec5b571f9 100644 --- a/mealie/routes/__init__.py +++ b/mealie/routes/__init__.py @@ -7,7 +7,6 @@ from . import ( comments, explore, groups, - ocr, organizers, parser, recipe, @@ -32,4 +31,3 @@ router.include_router(unit_and_foods.router) router.include_router(admin.router) router.include_router(validators.router) router.include_router(explore.router) -router.include_router(ocr.router) diff --git a/mealie/routes/ocr/__init__.py b/mealie/routes/ocr/__init__.py deleted file mode 100644 index e23bbc92ec8b..000000000000 --- a/mealie/routes/ocr/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -from fastapi import APIRouter - -from . import pytesseract - -router = APIRouter(prefix="/ocr") - -router.include_router(pytesseract.router) diff --git a/mealie/routes/ocr/pytesseract.py b/mealie/routes/ocr/pytesseract.py deleted file mode 100644 index d2ffdec62120..000000000000 --- a/mealie/routes/ocr/pytesseract.py +++ /dev/null @@ -1,37 +0,0 @@ -from fastapi import APIRouter, File - -from mealie.routes._base import BaseUserController, controller -from mealie.schema.ocr.ocr import OcrAssetReq, OcrTsvResponse -from mealie.services.ocr.pytesseract import OcrService -from mealie.services.recipe.recipe_data_service import RecipeDataService -from mealie.services.recipe.recipe_service import RecipeService - -router = APIRouter() - - -@controller(router) -class OCRController(BaseUserController): - def __init__(self): - self.ocr_service = OcrService() - - @router.post("/", response_model=str) - def image_to_string(self, file: bytes = File(...)): - return self.ocr_service.image_to_string(file) - - @router.post("/file-to-tsv", response_model=list[OcrTsvResponse]) - def file_to_tsv(self, file: bytes = File(...)): - tsv = self.ocr_service.image_to_tsv(file) - return self.ocr_service.format_tsv_output(tsv) - - @router.post("/asset-to-tsv", response_model=list[OcrTsvResponse]) - def asset_to_tsv(self, req: OcrAssetReq): - recipe_service = RecipeService(self.repos, self.user, self.group) - recipe = recipe_service._get_recipe(req.recipe_slug) - if recipe.id is None: - return [] - data_service = RecipeDataService(recipe.id, recipe.group_id) - asset_path = data_service.dir_assets.joinpath(req.asset_name) - file = open(asset_path, "rb") - tsv = self.ocr_service.image_to_tsv(file.read()) - - return self.ocr_service.format_tsv_output(tsv) diff --git a/mealie/routes/recipe/recipe_crud_routes.py b/mealie/routes/recipe/recipe_crud_routes.py index bace402ebd2e..16b7bc687d0d 100644 --- a/mealie/routes/recipe/recipe_crud_routes.py +++ b/mealie/routes/recipe/recipe_crud_routes.py @@ -27,10 +27,7 @@ from mealie.schema.make_dependable import make_dependable from mealie.schema.recipe import Recipe, RecipeImageTypes, ScrapeRecipe from mealie.schema.recipe.recipe import CreateRecipe, CreateRecipeByUrlBulk, RecipeLastMade, RecipeSummary from mealie.schema.recipe.recipe_asset import RecipeAsset -from mealie.schema.recipe.recipe_ingredient import RecipeIngredient from mealie.schema.recipe.recipe_scraper import ScrapeRecipeTest -from mealie.schema.recipe.recipe_settings import RecipeSettings -from mealie.schema.recipe.recipe_step import RecipeStep from mealie.schema.recipe.request_helpers import RecipeDuplicate, RecipeZipTokenResponse, UpdateImageResponse from mealie.schema.response import PaginationBase, PaginationQuery from mealie.schema.response.pagination import RecipeSearchQuery @@ -489,37 +486,3 @@ class RecipeController(BaseRecipeController): self.mixins.update_one(recipe, slug) return asset_in - - # ================================================================================================================== - # OCR - @router.post("/create-ocr", status_code=201, response_model=str) - def create_recipe_ocr( - self, extension: str = Form(...), file: UploadFile = File(...), makefilerecipeimage: bool = Form(...) - ): - """Takes an image and creates a recipe based on the image""" - slug = self.service.create_one( - Recipe( - name="New OCR Recipe", - recipe_ingredient=[RecipeIngredient(note="", title=None, unit=None, food=None, original_text=None)], - recipe_instructions=[RecipeStep(text="")], - is_ocr_recipe=True, - settings=RecipeSettings(show_assets=True), - id=None, - image=None, - recipe_yield=None, - rating=None, - orgURL=None, - date_added=None, - date_updated=None, - created_at=None, - update_at=None, - nutrition=None, - ) - ).slug - RecipeController.upload_recipe_asset(self, slug, "Original recipe image", "", extension, file) - if makefilerecipeimage: - # Get the pointer to the beginning of the file to read it once more - file.file.seek(0) - self.update_recipe_image(slug, file.file.read(), extension) - - return slug diff --git a/mealie/schema/ocr/__init__.py b/mealie/schema/ocr/__init__.py deleted file mode 100644 index 1c28eee01c6d..000000000000 --- a/mealie/schema/ocr/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# This file is auto-generated by gen_schema_exports.py -from .ocr import OcrAssetReq, OcrTsvResponse - -__all__ = [ - "OcrAssetReq", - "OcrTsvResponse", -] diff --git a/mealie/schema/ocr/ocr.py b/mealie/schema/ocr/ocr.py deleted file mode 100644 index fd5351110662..000000000000 --- a/mealie/schema/ocr/ocr.py +++ /dev/null @@ -1,21 +0,0 @@ -from mealie.schema._mealie import MealieModel - - -class OcrTsvResponse(MealieModel): - level: int = 0 - page_num: int = 0 - block_num: int = 0 - par_num: int = 0 - line_num: int = 0 - word_num: int = 0 - left: int = 0 - top: int = 0 - width: int = 0 - height: int = 0 - conf: float = 0.0 - text: str = "" - - -class OcrAssetReq(MealieModel): - recipe_slug: str - asset_name: str diff --git a/mealie/schema/recipe/recipe.py b/mealie/schema/recipe/recipe.py index ba49e00cd071..5b5cca65aed1 100644 --- a/mealie/schema/recipe/recipe.py +++ b/mealie/schema/recipe/recipe.py @@ -128,7 +128,6 @@ class Recipe(RecipeSummary): assets: list[RecipeAsset] | None = [] notes: list[RecipeNote] | None = [] extras: dict | None = {} - is_ocr_recipe: bool | None = False comments: list[RecipeCommentOut] | None = [] diff --git a/mealie/services/ocr/__init__.py b/mealie/services/ocr/__init__.py deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/mealie/services/ocr/pytesseract.py b/mealie/services/ocr/pytesseract.py deleted file mode 100644 index 83d84b676b09..000000000000 --- a/mealie/services/ocr/pytesseract.py +++ /dev/null @@ -1,56 +0,0 @@ -from io import BytesIO - -import pytesseract -from PIL import Image - -from mealie.schema.ocr.ocr import OcrTsvResponse -from mealie.services._base_service import BaseService - - -class OcrService(BaseService): - """ - Class for ocr engines. - """ - - def image_to_string(self, image_data): - """ - Returns a plain text translation of an image - """ - return pytesseract.image_to_string(Image.open(image_data)) - - def image_to_tsv(self, image_data, lang=None): - """ - Returns the pytesseract default tsv output - """ - if lang is not None: - return pytesseract.image_to_data(Image.open(BytesIO(image_data)), lang=lang) - - return pytesseract.image_to_data(Image.open(BytesIO(image_data))) - - def format_tsv_output(self, tsv: str) -> list[OcrTsvResponse]: - """ - Returns a OcrTsvResponse from a default pytesseract tsv output - """ - lines = tsv.split("\n") - titles = [t.strip() for t in lines[0].split("\t")] - response: list[OcrTsvResponse] = [] - - for i in range(1, len(lines)): - if lines[i] == "": - continue - - line = OcrTsvResponse() - for key, value in zip(titles, lines[i].split("\t"), strict=False): - if key == "text": - setattr(line, key, value.strip()) - elif key == "conf": - setattr(line, key, float(value.strip())) - elif key in OcrTsvResponse.__fields__: - setattr(line, key, int(value.strip())) - else: - continue - - if isinstance(line, OcrTsvResponse): - response.append(line) - - return response diff --git a/poetry.lock b/poetry.lock index 9bbd67e294de..3059793799bb 100644 --- a/poetry.lock +++ b/poetry.lock @@ -605,6 +605,7 @@ files = [ {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d967650d3f56af314b72df7089d96cda1083a7fc2da05b375d2bc48c82ab3f3c"}, {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, @@ -613,6 +614,7 @@ files = [ {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d4606a527e30548153be1a9f155f4e283d109ffba663a15856089fb55f933e47"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, @@ -642,6 +644,7 @@ files = [ {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1087300cf9700bbf455b1b97e24db18f2f77b55302a68272c56209d5587c12d1"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, @@ -650,6 +653,7 @@ files = [ {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8512a0c38cfd4e66a858ddd1b17705587900dd760c6003998e9472b77b56d417"}, {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, @@ -1862,21 +1866,6 @@ files = [ html5lib = "*" rdflib = "*" -[[package]] -name = "pytesseract" -version = "0.3.10" -description = "Python-tesseract is a python wrapper for Google's Tesseract-OCR" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytesseract-0.3.10-py3-none-any.whl", hash = "sha256:8f22cc98f765bf13517ead0c70effedb46c153540d25783e04014f28b55a5fc6"}, - {file = "pytesseract-0.3.10.tar.gz", hash = "sha256:f1c3a8b0f07fd01a1085d451f5b8315be6eec1d5577a6796d46dc7a62bd4120f"}, -] - -[package.dependencies] -packaging = ">=21.3" -Pillow = ">=8.0.0" - [[package]] name = "pytest" version = "7.2.2" @@ -2024,6 +2013,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -2031,8 +2021,15 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -2049,6 +2046,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -2056,6 +2054,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -2972,6 +2971,16 @@ files = [ {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be"}, + {file = "wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204"}, + {file = "wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, @@ -3025,4 +3034,4 @@ pgsql = ["psycopg2-binary"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "5e0cc403c1ec022e6a75a4969dd97c55ce312daafd7d2024a3617eca25b2129f" +content-hash = "984d725b667165ebbf82eeea32a38e4f4891192fc8c6be60864d25d5b36e7970" diff --git a/pyproject.toml b/pyproject.toml index 79cb8a450b50..b1fba8d7f90d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,6 @@ passlib = "^1.7.4" psycopg2-binary = { version = "^2.9.1", optional = true } pydantic = "^1.10.4" pyhumps = "^3.5.3" -pytesseract = "^0.3.9" python = "^3.10" python-dateutil = "^2.8.2" python-dotenv = "^1.0.0" diff --git a/tests/data/images/test-ocr.png b/tests/data/images/test-ocr.png deleted file mode 100644 index 1b699c9778d0b7b691845573347eac2e213664cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11513 zcmeI2XHb)0yY531X`<4*h)RhR4WSn$G(mc=0@Ay*P^733M7j{bPy&MVUV;!hqO{N< z^d`Lq2)!Nt@4NRtbI$C~XXec856@)gp3MEMN!DEJx_l%7#TS6bWd$`#;INLn% z@^iO&AZF#@0s#0-e zml{3XMnU)gw} zA*vIFB5pK^M)_?V5Hr}~-O7#*_VVlsNoLF8A>t^zbLrnnY!;E83p49~7mW=pNMVQp^K>vZlQ zID#}OeQL&)#(rOZHZD*jb?Q4h>z!3J|DAAck)MROY=yk&v9FIV8T>f_5akx%bR-hl zV%>H47?8Tn(KaMy$}LOlz7gqix&Be@HjvUNuWl)C*OwhSG9Bygx>FyK2*f&ldNv(7 zC^+Pd%(f9yYO2dTuwatLg?C$&Rvy46qh3S{SWzTezO?&<71W#fO*UTM3>L*n#o|gP zLUG3}^i1aagBY+R`leHXTUnqC5?v1rnB95Uc8sxMEX>w~YBcVQc}{byV=A@0DJe5$ zHT&-S5P|(I{3~m+E^M|Xi1}AJ`9qyf{i?F|b0Mv)c+lRF#!lr+5)@AK{ zckZz))t=wSv6<;PhK&X+hu&AG(NLGJ1rPf9pAO$qY$X#m2oyi-)4bSFXBS{YH2OJ^4Q(c87n%=3GXL8kFeq-YfeSy8$g)N0&7) zJABm?TLOi7xV_9bDTjiG&X3*n>(nC=6-vUu1~k9%>OusLZ+ESc%+U96@wQ_+NaR@! zr%Vm}kN<4X=ZNpF-|c43X4*bBxxz%fly=ox!o{c|BP_NbQhgzw#j!E$CiXJ-jz(%7 zjt@78FI0aTwuFm}$ zfu(qpR-Ck68+0}Y8~C<~xEIJ@JuztL21nL*w6~kc4rJno@-l<39DcZ@kjyh@>+e`FG<|c__)_Fd!Ff73V2L^Z4^%!vqxrm1nBdx|d{ty7G`O@tgzfcaO`K)SB`7U@xhVu$%<5D6nozX z!LM6E-+;dBbhw3-i>Ed;`=W32s@6+OPS+b8a3a#RhX!->s}li>WPJ>Zc!923#L2;Az&)$Pa?~KK{`^7w& zQs2ulw8Z&&>A}828KPWT5HF%#UA^M{R);H!W*Q^M=MSmp{Wkg`#1^OvpalS6{`tQ> zz49^%0Lm?N|JOms@s?*h{orw9;h2Yw68GyMjWu?hs+bMfWH10RreaD!q|kA7)YH^# z@HudB!}^g$=6Bpysu^d)os!Z>PWuNsTN)(}zbgo6TmN@sW%iFK>F#`^jbq7Rq(A!t z3;)tuLQ#gMFTHNk^%}{keaD369#a^S`TZ2CepI%^hesyQHn>(~d3dDzQ;|tFIzOCm#(sF;uP4v&u&o2KUOqR(wbEvL7e zvI@J@Ht|Z9kc{W{QKbW(ohg1XPN%WiCW+9r@{(a~%;6vQ@&&aYyq34?&n?bo@<2(I zbd{%CzI)C$nSWsxJ zXv(#~`}!?L4fc;sEWn#1Nh@QN@9o0GCI*wP!eeSZ$N%st*sFKCd_|)Q%do$cf1yV{L`!>va#DpmTc++U7^b6gFhd%}+uXPuz$agD?|Mdx0a^Nt#*L z7m7VXw2->s;C9NFeLeD*oWW-ZPl!j?Wq8y=oa}3}Z+USQHFqpaZI$Wo_L0D+4pjrl zjb#hWp}dz7+RB{aF)qPOQXT9rbEtHWl%pO*`Gt#>mx%`@dbI~lE#II2xz5`m)O7hA zd1tV!+o$t&A=W&5;B3HKFqc7?ZeobIcmjj^5_n~#uYA4t)`>O2);ju2M$?$wD=DDc z>~mW70Taz-C2f&Dzwq~-=sQPtQ&?trb-3w&gzbQYU0Nswe~a#3=~zB_%KC>ZsQT9t{e$n$@m)*Y z(nzejNQtfr4YNOw7+)caDM2=Gd9)7_G`Y-3?hw=M1NfsNvfUGkgK&qBF5rmI^ix-^IMA^Vab zl_@jpmrfdP;=ov^s)yX3&?hAB4uoTgv!Hi+odUY_&)sRQ>tbu|tlT|*QWx(oJR2Gahl0KDk!O~el3vZMP!tvue&^Nl8Pz6bd{Rhi9wQ>*&gzRrd(JS8)C8%{ zj^Wo8!n(XuE6z@l`+*~53D!)VO7Z+Bc}(4us?y_Yk-HSkDK6b4{fXd1leTUd&<{lv z(UFiDa|g`z5Ml@|bB2XJC@cwP&}MRNf5@py#h+hs)rof-tZRmKTTI#1mD-GP@N&%b zV{ap2totG}qLR`b<3*2`k~FVF8$6#^u3SFBxDFxHS-$Wo|0K*1el@kVx>o;Y?MN;A zurlzGTVFYfDVE*0(Du$}%Xo6NcQ8jC>OM)|Z~;Z7$cn3$i6Y-fJNpW%Al9)y&Ya$F zAWN{_Dft^m8&0ClAI=0?&}0`I-0eB5`KyhjCD2u5PMuU4Wmto&a6R-&#PR%N!zaS? zxQ=vfZ;nk?-;e zodHxtD?$}KCu<@*N3KCc*dn>@MZyXX+{`yck$4At9uioj60?pQG1PUx_dN6SoFSOU z+Cm1x&!MUpn*};tfR-jy-OWPgU$JL|Fl`V6MiQm&g|8I+ML*(8Hmw>tByFTxen#w` zuXu(@FZ2xT4XAF)?hkePQjgsoCu)&$I1VXedw1NJnZJEiI#<53@(^2WYxrtwMV%re z_x<^$8|VtVR5Gz+7LAX$)Rq7UCJGVH1YYN?{M=i7o+_H>XQZnB4dT5XRJSrq9O6Z0 zzz!u!-3R1uLsP?Ej$}oM32#12R+Bv{q8xlCgW%6|u`^6;B@Hn!3M6^zHG%BU3xdAq zw>$|sMcnP$WD2xVy+Z+*=iBC8b0syiTdNGH6XBgmfh_eVJ9$U}8m4c=rK^RiY-hV!#2W0co=@;Fj{CY zo)FyMBJHjEmmBDZ{PWt@AMdZ-P_45mR zf|#-0e&pEoIn**6Bj}YZG0k;)6>bJ6IVn|zW+T!clPc9k49A>bdCc?QKPYsj5ZNqs zP(=VH+XOuE|1M7hetLAav+aow=)MXS?)hv{`f~(=Xy%N zmIP4*s@4THKm#w28Stx_81KG2Zq8EZ^jFG~x{B-7%}XV7U}~G@+9qy|>dm{=<+0&c zrKetA@izTeVY+-9LldW3qUSMVn?L)H`~3MS;yLfMY5!n<1*c##2^*K;lxmoa*mhkM4AX?T>ZB<{gUF|I%A2U*&IMpLt*5S%B50~uYiybS;-K{_LdX_F{xmKSc(1P)KF|+J< zmu>c^hxe}3DQDE)Bv;b8<>UTTA8>neh?SA)t#wsxAwr0d@cc1RDm^}Hs)~tYypo9) zm8jBNh;EMF_~L`zc*N5CEjt#E6y{mic&pug_81v=qoYyX?N`#LrDS4S1wIcFTYU<2 z)3U11-u1boa=*W#3)rq9!QT@QL)YX!+Ml9Fc|V+)Jq`)CKdWin;n3COG(AIG1w3mm zB#!2PIQE`7*b%d97*rPLBXvkZ)?TT> z90qCzQbzN)6*bKHCBFYjY4<FJqc(uI`(;bd^^E)&=#UMZ+{yYMY?5*H2^OZ*R_h z6@30<#;oFP>T&m3UzHiZd18oNv-qT0|JrL5;k8rcL1D15$%xd{nOwJ#%W|09*psE? zmqh$iadQJKZ|0zOE2I8HWn#Wf`kr&rmGsRS$Pl>B#nkPDI%YJ=6W>Rqvax9kBqBn75SWUZRZKZ98NL3pt$pe#%rZA-=Mg7MI_RbicbV_)O}wN~ z8`jEz=Rjk0NwB>}xq_j%FGtLw1~}m}eE7#M@mYDt-;3RB*&5hDm24TkAFI-pwmY_XwVBw?F6G?rwZRzz8HD1Twetf>T zZ{H?aomn^5ll$Ryn%lm?2(PLuztuALeAZ^)pn`hj9Glh$U^Ux#Mz(xB@AoIZX(h+1z#ceug}doD8$KVzCo?bMdFtt zX7>r#tQzize5Axw`l0c7r zx{;TO6g3DrB~^+{)aPAZz1S#k{LNL&{m6fJngK)`YrVG!uQVwBN$9iSrv(V1A`>&* z8!lb!APPCQco@UT@)%{Sl?^jQeo1+753^fvgMR)IQ)z)t2wz~R)Rbsy_R+e5 zpG)cjQc*E0Wjj$BAipOv&Wa}^4Ab6JuoB^8b>$yv=LW&rC+Ej=U($jaTF3n1t@rLo zTV`idJ$)p8qyF<=XefzR7uSU9cAwr&E8*|rSl^`Ex58^O5vG1Q<;n_Op(`DsD&suK=8zU^ zPzfsyx%Sd%-))*Ob^I;Z@;=tV3FQI3wv`=1_Q}iM)>7!I+Dh!Z`Sh)g1~p`eWuRy^MWoL$NypQ&csSj{sVT zCn%WRXUn%F&>4Gx&Q!a9uhH=72EU8);-4FU{a z2LF(9k}OtRHg-~LcAMe?b}i7!zy-f3COg6m*l#rh-F@W4;mR$+w%pAh!5bNzNrf@Z zO*0e^+EYrh7&+54xQj0a156%{)Xv&q{T5g+vTbf5;PFUHpAB zI&knCdQJ88lco(u30~zEzfa5i+iYTo`6wrTHETWvc?e1z!}+?zOG^rW9hBw}T~2sw;_!X4;-0QtQXCOzPtRE*R<8@LQ0O0`u|PP^26I z4)~7bsciLoL!=6aUL6;Yn7iFUlyRt-*%KLC28zSL1;1O?{jLXQdZi)3flX`4d;z)v zxeZ+c0XfMWZ`FdI@v^W&xO8Py^-BCa)B5Py^Z&@p$P$qDwd4gC?Yd1c{k4EGya0p! zU#HUWu^av&UpPB`Ueo(Q@d4hN%cV6!b@PdvSv8J^YzK=&c1ckb|AQ#kHwB)XN(CwiBEDaQupMwG|xlt zzE+_I`CLY|-S*5_D=L?1(1G75ZLF<*k4Qj^_fTcQ>AB}=I+I#~u)_TnL-pMm{4+9f z-3uU|0ipwIAxm%>Wim@GITT4w7p55EG11WyuxScaE*K#^d->E8#4@9AbZXENzR1I$ zVN3~^xK*_ay7e7HqsQFDaTV`!?~ekPs+Z5x)1`Gqoe74V$(620w~6|J>>QiqAh-lCrVCc6;8 zIog@Hkq=FTO7+;mNzKwYEV_Lj}>21Kuo>YQ@-Jx%p>Wwby;x_(CJ(d4TJ-E`m zOd2{r>FfA1i_vHM*X z701LEE(W(+ScHh9xyN~Ay@Ln*v+IlH4RKO8Tk<^Ob1ikZEW1m)9Qb<`~ZE&B+ z@?6;3br3%FlLn}8O65lv>7UMtPagMJ#G^9I*U!gy^s880E~^Ys17HfxgAZkcpk^G( z+O_vA`!Bx00~@8^T^D@#?&o>IE%9xK4V#@@#C4<3CsYfwT#hM@(P1NaYUmh5@rd#z z^vwuUcP{ME{>!tnTDF<|JbEn>&)?S7a3wanY|QJr8T==d$;+vGwC6fCJ$(jpe01LH zTNnAMfl8a+)2jh?jY(mhcS$V^9P52N!{xTpbwu6@d#hP=A`weoY$01M#{PZsfiV~(z&;6vMtj;63zK#ZgsABD zj4)WN75HA4PtU*-AHR0yLy6JKeld7MK;d$EaN7G5^|SQoToARjC^)nR>#cE5!qAhh zZo9~Og3y~zQiCboV@bj_?0oIV%um=lAvT(@#gwE#xD!ht_qG7)pfAW-i*78}jSrP= zXwD}h7UZDuk~;c4HPxW?Gs}*vKvCF&ZPW!Dr0XrvDSvRSL*?OWHV?c=M7JOg{L6N3 zn8QWkkR!J5E}a7%N~|*==kpIT!(nDcq8z5+B+ohhJL>Cz zf6wF-0#QA*$7FJFv0j~6K%vahAjsYp_o6iXnz0=;IlX1{nlMMtnf&jO4tuc_*c_TZErGzRd*Id zI^VJQSDTGlqNCnh7g6a3IrQBT^=Tk7jg2Ripdq~!^LH5&ZZSUCzv89g`Zh&9Ib@dK zS0=_7wEG-^e~?uomMIg^#+&FY#lNliM+BH)2^lRe=ook+H32<(#yi)d--kYxW-5I0 z0PbBhUyxj9WA0Y1!Ph=8QXcu~0fTL|xpyfv)me*q<1%!OPRiFnHuSLWqI+NliwBxk zWpQe8r))Y|I%R|U(g=C~KGCqkHnQ^09tU2X|Cd#M@b^EhGOXg~E}|8c+S@o6rT^?z z8(sN<^9VAPsz{|elYSl*SZ z_&3?F&6%eGVOO$tw~bS@rQY++gIUf@N<3S$hL|1S)n=^}=H||VOWttQPDlE-JJ>k) zyUt>v{C2;!uT;FLg-r-xjyZFmP}0k<>-%oe-+!nU2!1E_V~U*Vc!|HPDGL#3w-`1g z@ae!8u8rAWpm~?sL>^8MV#fo2gWhO@5d&UiI#RpGg~VHwRp|nz>Y5sKaVQ4JfMMR` zI(JC;U_*oMqjPps0xqrec0kM95x>*I$h^#o$$%iATQ5o%q3AX8e?|v)Zy46UXXHG1 zTCY~SUqE1xTXu}ZheDmNIOfX&Q}A^^jkFuJqx|Su`e4F4lBjUTGikq*ZFt~^k2eEO zLhW5EVpbebm>9DTDo>BTGll;CT$qpR>47`Re~sJ8sa|qi|Nf}X#g38XOO`O!5E8-W z`rSIO&l+qk8cqkbYiqT??EdQYY3?$n2{*SnNP6Vjbm;nt>B}lY2_MexG&CJHO6sZI z5{~$m8#)Su0IPr4;&YFFEWrJ@%|hhJPTV+z^Y|K4n>Ech@ae-hK2qmk7)=F6XASNQ zl_xf{3?=`fpK@J@oh2JMoJ&xb6yD@0RIq4WTI5B3AV(hRTyMeaTAl9ukz~7c(cd*8 zSaSC}(+*}$jQ5LJrG5#WvYJ=Q4i*)(ajk?rCet`T6=HgtW@3A5KJ$$usKSuiQNPtd z!rI;TCL6b`t7AYCq>#H89lob{>Kosi=NQ960TIpco;6cq=Soh2)(v=i&A^wuI@V<= zo%Na`OPswrjho9ZYd(J&)qGzH+%mtv?vR^vSN(73&r7;}yw>s^l!S zHaK*LxxblEMgZ-z)(rEWWh26ZfyrlAlk3g?awazsLZ+-4Ehu1M#5DEdtZ}6*tjamO z;4S}Xwi(2($55e=D_LoxJPgt=(%`n)ba7$BGpb)DB}>rHsN_UQPyT>UUq;{`%Xv%?zB?xio0g!gvz7R#t`K$<1ajGN7f zV(r=Oea8hv9uSy}+oleec{-x2A0Mu8NuijC%RupZ`pxuOAhJJS(k;N!ownVkHYR=( z1VpQ!LU${42&(}a$SflvcgJz1$t})e?Eq!*In43vhO<_aW$lVE*@yLihkM&2p++Nt z7;sJb_Hvets7)bQW0>wvDEj7fPS8O;_T+bt9-hb{lFV#n`QeeRu!mvstk5>#mh zdpm(OSsKzE6wU3)&%xs#&l7F(qz;@HnMK>TV;jf)0aM5Avc~!aZ&%Hnt6mby{36>+ z&DOiZbZrX19tg%7^`xIfy&)8$ZAZbghVNYmr6m^GHrtK5FzOsEH^3^}oyAc8WsdFX4G?fkZZ#P%4~A;(k*6pU_3E5HyzdMD zLdMuan6^$>r`*yK>3&Kv5`WEnUz$)TRqC&B2<`F>-em}Jzxd6esTpxIzSigmCKCIW zi(YS0YThM%bR&MNuR{o?9nEVN6Si;W@J85DZ)E%D$Bt$3 zAw?DhtMcg8vllkbb}ogVF-7}8UqasSmxbTk?IkXryPTVAxH=cu_BIGGc$77oPTqh~7MRS2?VII1=p3tyzz0kZ>q7`@ z=noY(ArH>CMHVJgYuYO~pU8WoUee*C4ZmqvR`Wd^$8iVRCHG|d#rn_k|_AGgU@?j zhT_=c(?89HS*y{zS1g9NvbqtmolVf89Rh=Ks{am@^417#g}K&m>`WJkR)y0~FIv1x zyuO<>7ZqsQ0BjXNt%aa?mK3G--XC==9yl)HlQ`{v*a)r@@lrwyl&}rp>ojqv%3W_+ z5Bi#HZc_q5cZBvlQy`VI`Ojmd*78KnTE_62=aNo;=*C>0Vez6oYqlKoW;mlU*n?tzG*u?JNv|eiS0g8fLwMhFn$k6T?#K3=FRGJG?2jLIT||h+(BXd z5;xHB58ANWx{Prgp8@0Z(Pab`_>%ZicW}|zUZBRsbG?(w<9DJt>`Gqek!90Pw7)}h zHE@2=PaX`6O1~#l?ks}3`^}DYZ7t$Nf?A}v8{EBPg@&Zv2i$u1N2%#)Lp^6*|leUxpqaD=<|wGB@!f9mYE ziYEz1@{CccY~Q&vlVx_?6W?N79HpJ;s_XKOLiX?bN3-2>NK3E$lMwB_MFN%TrIKg& zNX1|T4_?+`<20#i9YYXeB2Xp5-`D6SXN!Q}UxNrzTq2K?AH2QIT$oISKX}2EM40)9 zZ0D^zNz~ul{- Date: Fri, 15 Dec 2023 09:05:28 -0600 Subject: [PATCH 02/68] hotfix: disable cache (#2848) --- .github/workflows/partial-builder.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/partial-builder.yml b/.github/workflows/partial-builder.yml index 2af0f128f714..46ebc41a9567 100644 --- a/.github/workflows/partial-builder.yml +++ b/.github/workflows/partial-builder.yml @@ -59,5 +59,7 @@ jobs: build-args: | COMMIT=${{ github.sha }} # https://docs.docker.com/build/ci/github-actions/cache/#github-cache - cache-from: type=gha - cache-to: type=gha,mode=max + # TEMP: Disable cache to possible fix missing LDAP issues + # https://github.com/mealie-recipes/mealie/issues/2847 + # cache-from: type=gha + # cache-to: type=gha,mode=max From 46c1a2f0b806af3db833b3743ac1bf0e53087a8b Mon Sep 17 00:00:00 2001 From: Carter <35710697+cmintey@users.noreply.github.com> Date: Fri, 15 Dec 2023 11:38:09 -0600 Subject: [PATCH 03/68] add libldap-2.5 to runtime dependencies (#2849) --- docker/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index ee422ff643eb..919d27b7d007 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -89,6 +89,7 @@ RUN apt-get update \ gosu \ iproute2 \ libldap-common \ + libldap-2.5 \ && rm -rf /var/lib/apt/lists/* # copying poetry and venv into image From 2236a93a91af204f3873011ab86a2b2dba8db03b Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Fri, 15 Dec 2023 16:03:12 -0600 Subject: [PATCH 04/68] New translations en-us.json (Norwegian) (#2851) --- frontend/lang/messages/no-NO.json | 172 +++++++++++++++--------------- 1 file changed, 86 insertions(+), 86 deletions(-) diff --git a/frontend/lang/messages/no-NO.json b/frontend/lang/messages/no-NO.json index dc07cf56f889..671e772c6a64 100644 --- a/frontend/lang/messages/no-NO.json +++ b/frontend/lang/messages/no-NO.json @@ -188,7 +188,7 @@ "last-made": "Sist laget", "learn-more": "Lær mer", "this-feature-is-currently-inactive": "Denne funksjonen er for øyeblikket deaktivert", - "clipboard-not-supported": "Utklippstavlen støttes ikke", + "clipboard-not-supported": "Utklippstavle støttes ikke", "copied-to-clipboard": "Kopiert til utklippstavle", "your-browser-does-not-support-clipboard": "Nettleseren din støtter ikke kopiering til utklippstavle", "copied-items-to-clipboard": "Ingen elementer kopiert til utklippstavlen|Ett element kopiert til utklippstavlen|{count} elementer til kopiert til utklippstavlen", @@ -225,25 +225,25 @@ "keep-my-recipes-private-description": "Setter gruppen din og alle oppskrifter som standard til privat. Du kan alltids endre dette senere." }, "manage-members": "Administrer medlemmer", - "manage-members-description": "Administrere rettighetene til medlemmene i dine grupper. {manage} gir brukeren tilgang til data-administrasjonssiden {invite} mulighet til å generere invitasjonslenker for andre brukere. Gruppeeiere kan ikke endre egne tillatelser.", + "manage-members-description": "Administrer rettighetene til medlemmene i gruppene dine. {manage} lar brukeren få tilgang til dataadministrasjonssiden. {invite} lar brukeren generere invitasjonslenker for andre brukere. Gruppeeiere kan ikke endre egne tillatelser.", "manage": "Administrer", "invite": "Inviter", "looking-to-update-your-profile": "Ønsker du å oppdatere profilen din?", "default-recipe-preferences-description": "Dette er standardinnstillingene når en ny oppskrift blir opprettet i gruppen din. Disse kan endres for individuelle oppskrifter i oppskriftsmenyen.", - "default-recipe-preferences": "Standard Oppskriftsinnstillinger", + "default-recipe-preferences": "Standard oppskriftsinnstillinger", "group-preferences": "Gruppeinnstillinger", "private-group": "Privat gruppe", - "private-group-description": "Hvis din gruppe settes til privat, vil alle instillinger setter til standard. Dette overstyrer en individuell oppskrifter offentlige innstillinger.", + "private-group-description": "Når du setter gruppen din til privat, vil alle offentlige visningsalternativer tilbakestilles til standardverdiene. Dette overskriver individuelle oppskrifters offentlige visningsinnstillinger.", "allow-users-outside-of-your-group-to-see-your-recipes": "Tillat brukere utenfor gruppen å se oppskriftene dine", - "allow-users-outside-of-your-group-to-see-your-recipes-description": "Når aktivert kan du bruke en lenke for offentlig deling til å dele bestemte oppskrifter uten å autorisere brukeren. Når deaktivert kan du bare dele oppskrifter med brukere i gruppen din eller med en forhåndsgenerert privat link", + "allow-users-outside-of-your-group-to-see-your-recipes-description": "Når aktivert, kan du bruke en offentlig lenke for å dele spesifikke oppskrifter uten å autorisere brukeren. Når deaktivert, kan du kun dele oppskrifter med brukere som er i gruppen din eller med en forhåndsgenerert privat lenke", "show-nutrition-information": "Vis ernæringsinformasjon", "show-nutrition-information-description": "Når aktivert vil ernæringsinformasjonen bli vist på oppskriften hvis tilgjengelig. Hvis det ikke finnes noen ernæringsinformasjon tilgjengelig vil ikke ernæringsinformasjonen vises", "show-recipe-assets": "Vis oppskriftsressurser", "show-recipe-assets-description": "Når aktivert, vil oppskriftsressurser bli vist på oppskriften hvis de er tilgjengelige", - "default-to-landscape-view": "Standard liggende visning", + "default-to-landscape-view": "Sett landskapsvisning som standard", "default-to-landscape-view-description": "Når aktivert, vil oppskriftsoverskriften vises i landskapsvisning", - "disable-users-from-commenting-on-recipes": "Deaktiver brukere fra å kommentere på oppskrifter", - "disable-users-from-commenting-on-recipes-description": "Skjuler kommentarfeltet på oppskriftssiden og deaktiverer kommentarer", + "disable-users-from-commenting-on-recipes": "Deaktiver muligheten for at brukere kan kommentere på oppskrifter", + "disable-users-from-commenting-on-recipes-description": "Skjuler kommentarfeltet på oppskriftssiden og deaktiverer kommentering", "disable-organizing-recipe-ingredients-by-units-and-food": "Deaktiver organisering av oppskriftsingredienser ved enheter og matvarer", "disable-organizing-recipe-ingredients-by-units-and-food-description": "Skjuler matvare-, enhet- og mengdefelt for ingredienser og behandler ingredienser som rene tekstfelt.", "general-preferences": "Generelle innstillinger", @@ -252,7 +252,7 @@ "report-with-id": "Rapport-ID: {id}", "group-management": "Gruppeadministrasjon", "admin-group-management": "Admin gruppeadministrasjon", - "admin-group-management-text": "Endringer i denne gruppen vil umiddelbart bli reflektert.", + "admin-group-management-text": "Endringer i denne gruppen vil gjenspeiles umiddelbart.", "group-id-value": "Gruppe-ID: {0}" }, "meal-plan": { @@ -289,67 +289,67 @@ "dinner": "Middag", "type-any": "Enhver", "day-any": "Enhver", - "editor": "Redigering", - "meal-recipe": "Måltid oppskrift", - "meal-title": "Navn på måltid", - "meal-note": "Måltid Notat", + "editor": "Redigeringsverktøy", + "meal-recipe": "Oppskrift på måltid", + "meal-title": "Tittel på måltid", + "meal-note": "Notat for måltid", "note-only": "Kun notat", "random-meal": "Tilfeldig måltid", - "random-dinner": "Tilfeldig Middag", - "random-side": "Tilfeldig Tilbehør", + "random-dinner": "Tilfeldig middag", + "random-side": "Tilfeldig tilbehør", "this-rule-will-apply": "Denne regelen vil gjelde for {dayCriteria} {mealTypeCriteria}.", "to-all-days": "til alle dager", - "on-days": "på {0}s", + "on-days": "på {0}er", "for-all-meal-types": "for alle måltidstyper", "for-type-meal-types": "for {0} måltidstyper", "meal-plan-rules": "Regler for måltidsplan", "new-rule": "Ny regel", "meal-plan-rules-description": "Du kan opprette regler for automatisk valg av oppskrifter for dine måltidsplaner. Disse reglene brukes av serveren til å bestemme det tilfeldige utvalget av oppskrifter som skal velges fra når det opprettes måltidsplaner. Vær oppmerksom på at hvis regler har de samme begrensningene for dag/type, vil kategoriene til reglene bli slått sammen. I praksis er det unødvendig å opprette duplikater av regler, men det er mulig å gjøre det.", "new-rule-description": "Ved opprettelse av en ny regel for en måltidsplan kan du begrense regelen til å gjelde for en bestemt ukedag og/eller en bestemt type måltid. For å ta i bruk en regen alle dager eller alle måltider kan du sette regelen til \"Enhver\" som gjelder for alle mulige verdier for dag- og/eller måltidstyper.", - "recipe-rules": "Oppskrift Regler", + "recipe-rules": "Regler for oppskrifter", "applies-to-all-days": "Gjelder for alle dager", - "applies-on-days": "Gjelder på {0}s", + "applies-on-days": "Gjelder på {0}er", "meal-plan-settings": "Innstillinger for måltidsplan" }, "migration": { - "migration-data-removed": "Migrasjonsdata er fjernet", - "new-migration": "Ny migrering", + "migration-data-removed": "Overføringsdata er fjernet", + "new-migration": "Ny overføring", "no-file-selected": "Ingen fil valgt", - "no-migration-data-available": "Ingen migrasjonsdata tilgjengelig", - "previous-migrations": "Tidligere migreringer", - "recipe-migration": "Oppskriftsmigrering", + "no-migration-data-available": "Ingen overføringsdata tilgjengelig", + "previous-migrations": "Tidligere overføringer", + "recipe-migration": "Oppskriftsoverføring", "chowdown": { "description": "Overfør data fra Chowdown", - "description-long": "Mealie nativt støtter chowdown depotet. Last ned kodelageret som en .zip-fil og last det opp nedenfor.", + "description-long": "Mealie støtter Chowdown-arkivformatet. Last ned kodearkivet som en .zip-fil og last den opp nedenfor.", "title": "Chowdown" }, "nextcloud": { - "description": "Migrer data fra en Nextcloud Cookbook instans", - "description-long": "Nextcloud oppskrifter kan importeres fra en zip-fil som inneholder dataene lagret i Nextcloud. Se mappestrukturen for eksempel nedenfor for å sikre at oppskriftene kan importeres.", + "description": "Overfør data fra en Nextcloud Cookbook-instans", + "description-long": "Oppskrifter fra Nextcloud kan importeres fra en zip-fil som inneholder dataene lagret i Nextcloud. Se eksempelet på mappestrukture nedenfor for å sikre at oppskriftene kan importeres.", "title": "Nextcloud Cookbook" }, "copymethat": { - "description-long": "Mealie kan importere oppskrifter fra Copy Me. Eksporter oppskrifter i HTML-format, deretter last opp .zip-filen under.", - "title": "Copy Me That oppskriftsbehandlingen" + "description-long": "Mealie kan importere oppskrifter fra Copy Me That. Eksporter oppskrifter i HTML-format, last deretter opp .zip-filen under.", + "title": "Copy Me That oppskriftsbehandler" }, "paprika": { "description-long": "Mealie kan importere oppskrifter fra Paprika. Eksporter oppskriftene fra Paprika, endre filnavnutvidelsen til .zip og last den opp nedenfor.", - "title": "Paprika Oppskriftsbehandler" + "title": "Paprika oppskriftsbehandler" }, "mealie-pre-v1": { "description-long": "Mealie kan importere oppskrifter fra Mealie fra versjoner eldre enn v1.0. Eksporter oppskriftene fra din gamle versjon og last opp zip-filen under. Merk at bare oppskrifter kan importeres fra eksporten.", "title": "Mealie Pre v1.0" }, "tandoor": { - "description-long": "Mealie kan importere oppskrifter fra Tandoor. Eksporter dataene i \"Standard\"-formatet, deretter last opp .zip-formatet nedenfor.", + "description-long": "Mealie kan importere oppskrifter fra Tandoor. Eksporter dataene i \"Standard\"-formatet, last deretter opp .zip-formatet nedenfor.", "title": "Tandoor oppskrifter" }, - "recipe-data-migrations": "Oppskriftsmigrering", + "recipe-data-migrations": "Overføring av oppskrifter", "recipe-data-migrations-explanation": "Oppskrifter kan overføres fra et annet støttet program til Mealie. Dette er en flott måte å komme i gang med Mealie på.", - "choose-migration-type": "Velg migrasjonstype", + "choose-migration-type": "Velg type overføring", "tag-all-recipes": "Merk alle oppskrifter med {tag-name}-emneord", - "nextcloud-text": "Nextcloud oppskrifter kan importeres fra en zip-fil som inneholder dataene lagret i Nextcloud. Se mappestrukturen for eksempel nedenfor for å sikre at oppskriftene kan importeres.", - "chowdown-text": "Mealie nativt støtter chowdown depotet. Last ned kodelageret som en .zip-fil og last det opp nedenfor", + "nextcloud-text": "Oppskrifter fra Nextcloud kan importeres fra en zip-fil som inneholder dataene lagret i Nextcloud. Se eksempelet på mappestrukture nedenfor for å sikre at oppskriftene kan importeres.", + "chowdown-text": "Mealie støtter Chowdown-arkivformatet. Last ned kodearkivet som en .zip-fil og last den opp nedenfor", "recipe-1": "Oppskrift 1", "recipe-2": "Oppskrift 2", "paprika-text": "Mealie kan importere oppskrifter fra Paprika. Eksporter oppskriftene fra Paprika, endre filnavnutvidelsen til .zip og last den opp nedenfor.", @@ -374,9 +374,9 @@ "upload-individual-zip-file": "Last opp en individuell .zip-fil eksportert fra en annen Mealie-instans.", "url-form-hint": "Kopier og lim inn en link fra favorittoppskriftsnettstedet ditt", "view-scraped-data": "Vis skrapte data", - "trim-whitespace-description": "Trim innledende og etterfølgende mellomrom i tillegg til tomme linjer", + "trim-whitespace-description": "Fjern innledende og etterfølgende mellomrom i tillegg til tomme linjer", "trim-prefix-description": "Fjern første tegn fra hver linje", - "split-by-numbered-line-description": "Forsøk å dele et avsnitt ved å matche mønsteret '1)' eller '1.'", + "split-by-numbered-line-description": "Forsøk å dele opp et avsnitt ved å matche mønsteret '1)' eller '1.'", "import-by-url": "Importer en oppskrift via URL", "create-manually": "Opprett en oppskrift manuelt", "make-recipe-image": "Bruk dette som oppskriftsbilde" @@ -412,7 +412,7 @@ "description": "Beskrivelse", "disable-amount": "Deaktiver ingrediensmengde", "disable-comments": "Deaktiver kommentarer", - "duplicate": "Duplikat-oppskrift", + "duplicate": "Dupliser oppskrift", "duplicate-name": "Navn på den nye oppskriften", "edit-scale": "Rediger skala", "fat-content": "Fett", @@ -465,7 +465,7 @@ "add-recipe-to-mealplan": "Legg til oppskrift i måltidsplan", "entry-type": "Oppføringstype", "date-format-hint": "MM/DD/ÅÅÅÅ-format", - "date-format-hint-yyyy-mm-dd": "ÅÅÅÅ-MM-DD format", + "date-format-hint-yyyy-mm-dd": "ÅÅÅÅ-MM-DD-format", "add-to-list": "Legg til i liste", "add-to-plan": "Legg til i plan", "add-to-timeline": "Legg til på tidslinjen", @@ -501,15 +501,15 @@ "resume-timer": "Fortsett nedtellingen", "stop-timer": "Stopp nedtellingen" }, - "edit-timeline-event": "Endre hendelsestidslinjen", + "edit-timeline-event": "Endre tidslinjehendelser", "timeline": "Tidslinje", "timeline-is-empty": "Ingenting på tidslinjen ennå. Prøv å lage denne oppskriften!", "group-global-timeline": "{groupName} Global tidslinje", "open-timeline": "Åpne tidslinje", - "made-this": "Jeg har lagd dette", - "how-did-it-turn-out": "Hvordan ble det?", - "user-made-this": "{user} har lagd denne", - "last-made-date": "Sist lagd {date}", + "made-this": "Jeg har laget denne", + "how-did-it-turn-out": "Hvordan ble den?", + "user-made-this": "{user} har laget denne", + "last-made-date": "Sist laget: {date}", "api-extras-description": "Ekstramaterialer til oppskrifter er en viktig funksjon i Mealie API-en. De lar deg opprette egendefinerte JSON-nøkkel/verdi-par innenfor en oppskrift for å referere fra tredjepartsapplikasjoner. Du kan bruke disse nøklene til å gi informasjon for eksempel for å utløse automatiseringer eller egendefinerte meldinger som skal videreformidles til ønsket enhet.", "message-key": "Meldingsnøkkel", "parse": "Del opp", @@ -521,24 +521,24 @@ "edit-markdown": "Rediger Markdown", "recipe-creation": "Opprett oppskrift", "select-one-of-the-various-ways-to-create-a-recipe": "Velg en av de ulike måtene å opprette en oppskrift", - "looking-for-migrations": "Ser du etter migrasjoner?", - "import-with-url": "Importer med URL", + "looking-for-migrations": "Ser du etter overføringer?", + "import-with-url": "Importer via URL", "create-recipe": "Opprett oppskrift", - "import-with-zip": "Importer med .zip", + "import-with-zip": "Importer fra .zip-fil", "create-recipe-from-an-image": "Opprett oppskrift fra et bilde", - "bulk-url-import": "Importer flere URL'er", + "bulk-url-import": "Importer flere URL-er", "debug-scraper": "Feilsøk skraper", "create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Opprett en oppskrift ved å angi navnet. Alle oppskrifter må ha unike navn.", "new-recipe-names-must-be-unique": "Oppskriftsnavn må være unike", "scrape-recipe": "Hent oppskrift", "scrape-recipe-description": "Scrape en oppskrift ved url. Angi Url-adressen for nettstedet du vil skrape, Og Mealie vil forsøke å skrape oppskriften fra det området og legge den til i samlingen din.", "import-original-keywords-as-tags": "Importer originale søkeord som emneord", - "stay-in-edit-mode": "Bli i skrivemodus", - "import-from-zip": "Importer fra Zip", + "stay-in-edit-mode": "Forbli i redigeringsmodus", + "import-from-zip": "Importer fra zip-fil", "import-from-zip-description": "Importer en enkelt oppskrift som ble eksportert fra en annen Mealie-instans.", "zip-files-must-have-been-exported-from-mealie": ".zip-filer må ha blitt eksportert fra Mealie", "create-a-recipe-by-uploading-a-scan": "Lag en oppskrift ved å laste opp en skanning.", - "upload-a-png-image-from-a-recipe-book": "Last opp et png bilde fra en oppskriftsbok", + "upload-a-png-image-from-a-recipe-book": "Last opp et png-bilde fra en oppskriftsbok", "recipe-bulk-importer": "Oppskrift masse-import", "recipe-bulk-importer-description": "Masse-oppskriftsimporten lar deg importere flere oppskrifter samtidig ved å sette i kø på kontrollstedene på bakgrunnen og kjøre oppgaven i bakgrunnen. Dette kan være nyttig ved først å migrere til Mealie, eller når du vil importere et stort antall oppskrifter.", "set-categories-and-tags": "Sett kategorier og emneord", @@ -546,11 +546,11 @@ "bulk-import-process-has-started": "Masseimport har startet", "bulk-import-process-has-failed": "Masseimport mislyktes", "report-deletion-failed": "Raport sletting feilet", - "recipe-debugger": "Oppskrift Feilsøking", + "recipe-debugger": "Oppskriftsfeilsøker", "recipe-debugger-description": "Hent URL-adressen til oppskriften du vil feilsøke og lim den inn her. URL-adressen vil bli skrapt av oppskrifts-skraperen og resultatene vil bli vist. Hvis du ikke ser noen data returnert, er ikke nettstedet du prøver å skrape støttet av Mealie eller skraper-biblioteket.", "debug": "Feilsøk", "tree-view": "Trevisning", - "recipe-yield": "Oppskrift uttak", + "recipe-yield": "Utbytte av oppskrift", "unit": "Enhet", "upload-image": "Last opp bilde", "screen-awake": "Hold skjerm på", @@ -592,13 +592,13 @@ "partial-backup": "Delvis sikkerhetskopi", "unable-to-delete-backup": "Kan ikke slette sikkerhetskopi.", "experimental-description": "Sikkerhetskopier er komplette øyeblikksbilder av databasen og datamappen til nettstedet. Dette inkluderer all data og kan ikke settes til å ekskludere delsett av data. Du kan tenke på dette som et øyeblikksbilde av Mealie på et bestemt tidspunkt. Disse fungerer som en databasesystemuavhengig måte å eksportere og importere data på, eller sikkerhetskopiere nettstedet til en ekstern plassering.", - "backup-restore": "Sikkerhetskopiering / gjenoppretting", + "backup-restore": "Gjenoppretting av sikkerhetskopi", "back-restore-description": "Gjenoppretting av denne sikkerhetskopien vil overskrive alle gjeldende data i databasen og i datamappen og erstatte dem med innholdet i denne sikkerhetskopien. {cannot-be-undone} Hvis gjenopprettingen er vellykket, vil du bli logget ut.", - "cannot-be-undone": "Denne handlingen kan ikke angres – brukes med forsiktighet.", + "cannot-be-undone": "Denne handlingen kan ikke angres – bruk med forsiktighet.", "postgresql-note": "Hvis du bruker PostGreSQL, vennligst gå igjennom {backup-restore-process} før du gjenoppretter.", "backup-restore-process-in-the-documentation": "sikkerhetskopiering/gjenoppretting prosess i dokumentasjonen", - "irreversible-acknowledgment": "Jeg forstår at dette er irreversibel, destruktiv og kan føre til tap av data", - "restore-backup": "Gjenopprett sikkerhetskopien" + "irreversible-acknowledgment": "Jeg forstår at denne handlingen er irreversibel, destruktiv og kan føre til tap av data", + "restore-backup": "Gjenopprett sikkerhetskopi" }, "backup-and-exports": "Sikkerhetskopier", "change-password": "Endre passord", @@ -653,7 +653,7 @@ "theme-updated": "Tema oppdatert", "warning": "Advarsel", "light-mode": "Lys modus", - "dark-mode": "Mørkemodus" + "dark-mode": "Mørk modus" }, "token": { "active-tokens": "AKTIVE TOKENS", @@ -677,23 +677,23 @@ "unorganized": "Uorganisert" }, "webhooks": { - "test-webhooks": "Test Webhooks", + "test-webhooks": "Test webhooks", "the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "URL-adressene som er oppført nedenfor vil motta webhooks med oppskriftsdata for måltidsplanen på dens planlagte dag. For øyeblikket vil webhooks utføres på", "webhook-url": "Webhook-URL", "webhooks-caps": "WEBHOOKS", "webhooks": "Webhooks", - "webhook-name": "Webhook navn", + "webhook-name": "Navn på webhook", "description": "Webhooks definert nedenfor vil utføres når et måltid defineres for dagen. På det planlagte tidspunktet blir webhook sendt med data fra oppskriften som er planlagt for dagen. Merke at av tidspunktet ikke er nøyaktig, webhooks utføres med et intervall på 5 minutter, dette betyr at webhooks utføres innen +/- 5 minutter etter planlagt tidspunkt." }, "bug-report": "Feilrapport", "bug-report-information": "Bruk denne informasjonen til å rapportere en feil. Å gi detaljer om installasjonen din til utviklerne er den beste måten å få løst problemene dine raskt på.", "tracker": "Sporingsagent", "configuration": "Konfigurasjon", - "docker-volume": "Docker volum", + "docker-volume": "Docker-volum", "docker-volume-help": "Mealie krever at frontend- og backend-konteinerene deler samme docker-volum eller lagringssted. Dette sikrer at frontend-kontaineren får tilgang til bilder og ressurser lagret på harddisken.", "volumes-are-misconfigured": "Volumene er feilkonfigurert.", "volumes-are-configured-correctly": "Volumene er riktig konfigurert.", - "status-unknown-try-running-a-validation": "Statusen er ukjent. Prøv å validere.", + "status-unknown-try-running-a-validation": "Statusen er ukjent. Prøv å kjør en validering.", "validate": "Valider", "email-configuration-status": "E-postkonfigurasjonsstatus", "email-configured": "E-post konfigurert", @@ -715,7 +715,7 @@ "ldap-ready": "LDAP klar", "ldap-ready-error-text": "Ikke alle LDAP-verdier er konfigurert. Dette kan ignoreres hvis du ikke bruker LDAP-autentisering.", "ldap-ready-success-text": "Alle obligratoriske LDAP-variabler er satt.", - "build": "Bygg", + "build": "Build", "recipe-scraper-version": "OppskriftsScraper versjon" }, "shopping-list": { @@ -740,11 +740,11 @@ "toggle-label-sort": "Bytt etikettsortering", "reorder-labels": "Omorganiser etiketter", "uncheck-all-items": "Fjern merking av alle elementer", - "check-all-items": "Velg alle elementer", + "check-all-items": "Marker alle elementer", "linked-recipes-count": "Ingen lenkede oppskrifter|En lenket oppskrift|{count} Lenkede oppskrifter", "items-checked-count": "Ingen elementer krysset av|Ett element krysset av|{count} elementer krysset av", "no-label": "Ingen etikett", - "completed-on": "Fullført på {date}" + "completed-on": "Fullført den {date}" }, "sidebar": { "all-recipes": "Alle oppskrifter", @@ -1020,12 +1020,12 @@ "share-recipe": "Del oppskrift", "default-30-days": "Standard 30 dager", "expires-at": "Utløper den", - "recipe-link-copied-message": "Lenke kopiert til utklippstavle" + "recipe-link-copied-message": "Oppskriftslenke kopiert til utklippstavle" }, "banner-experimental": { - "title": "Eksperimentelle Funksjoner", + "title": "Eksperimentelle funksjoner", "description": "Denne siden inneholder eksperimentelle og uferdige funksjoner. Beklager rotet.", - "issue-link-text": "Følg fremgangen din her" + "issue-link-text": "Følg vår fremgang her" }, "form": { "quantity-label-abbreviated": "Ant" @@ -1039,34 +1039,34 @@ "demo_password": "Passord: {password}" }, "ocr-editor": { - "ocr-editor": "redigere OCR", + "ocr-editor": "OCR-redigering", "toolbar": "Verktøylinje", - "selection-mode": "Velg modus", + "selection-mode": "Markeringsmodus", "pan-and-zoom-picture": "Panorer og zoom bilde", "split-text": "Splitt tekst", - "preserve-line-breaks": "Behold opprinnelige linjeskift", - "split-by-block": "Del på tekstblokk", - "flatten": "Flat ut, uavhengig av orginalformatering.", + "preserve-line-breaks": "Bevar opprinnelig linjeskift", + "split-by-block": "Del etter tekstblokk", + "flatten": "Flat ut uavhengig av orginalformatering", "help": { "help": "Hjelp", "mouse-modes": "Musemodus", - "selection-mode": "Valgmodus (standard)", - "selection-mode-desc": "Utvalgsmodus er hovedmodus som kan brukes til å legge inn data:", + "selection-mode": "Markeringsmodus (standard)", + "selection-mode-desc": "Markeringsmodusen er hovedmodusen som kan brukes til å legge inn data:", "selection-mode-steps": { - "draw": "Tegn et rektangel på teksten du vil velge.", + "draw": "Tegn en firkant på teksten du vil velge.", "click": "Klikk på valgfritt felt til høyre, deretter klikk tilbake på firkanten over bildet.", "result": "Den markerte teksten vil bli lagt inn i det tidligere valgte feltet." }, - "pan-and-zoom-mode": "Panér og Zoom modus", - "pan-and-zoom-desc": "Velg pan og zoom ved å klikke ikonet. Denne modusen gjør det lettere å bruke store bilder, ved at du kan zoome og flytte rundt på bildet.", - "split-text-mode": "Splitt tekstmodus", + "pan-and-zoom-mode": "Panorer- og zoommodus", + "pan-and-zoom-desc": "Velg panorer og zoom ved å klikke på ikonet. Denne modusen gjør det lettere å bruke store bilder ved at du kan zoome og flytte rundt på bildet.", + "split-text-mode": "Splitt-tekst-moduser", "split-modes": { "line-mode": "Linjemodus (standard)", - "line-mode-desc": "I linjemodus, vil teksten bli oppdelt ut i fra de orginale linjeskiftene. Denne modusen er nytting når man legger til ingredienslister i bulk der hver ingrediens er på egen linje.", - "block-mode": "Blokk modus", - "block-mode-desc": "I blokkmodus vil teksten bli delt i blokker. Denne modusen er nyttig når man legger inn istruksjoner i bulk, som vanligvis er skrevet i avsnitt.", + "line-mode-desc": "I linjemodus vil teksten bli oppdelt ut i fra de orginale linjeskiftene. Denne modusen er nyttig når man legger til ingredienslister i bulk der hver ingrediens er på egen linje.", + "block-mode": "Blokkmodus", + "block-mode-desc": "I blokkmodus vil teksten bli delt inn i blokker. Denne modusen er nyttig når du legger til instruksjoner i bulk som vanligvis er skrevet i avsnitt.", "flat-mode": "Flat modus", - "flat-mode-desc": "I flat modus vil teksten bli lagt til i det valgte oppskriftsfeltet uten noen linjeskift." + "flat-mode-desc": "I flat modus vil teksten bli lagt til i det valgte oppskriftsfeltet uten linjeskift." } } }, @@ -1136,7 +1136,7 @@ "personal-description": "Dette er innstillingene som er personlige for deg. Endringer her påvirker ikke andre brukere", "user-settings": "Brukerinnstillinger", "user-settings-description": "Administrer innstillingene, endre passordet og oppdater e-postadressen din", - "api-tokens-description": "Håndter dine API-tokens for tilgang fra eksterne programmer", + "api-tokens-description": "Administrer dine API-tokens for tilgang fra eksterne programmer", "group-description": "Disse elementene deles innad i gruppen din. Å redigere ett av dem vil endre det for hele gruppen!", "group-settings": "Gruppeinnstillinger", "group-settings-description": "Administrer felles gruppeinnstillinger som måltidsplan- og personverninnstillinger.", @@ -1148,7 +1148,7 @@ "notifiers-description": "Sett opp e-post- og pushvarsler som utløses av spesifikke hendelser.", "manage-data": "Administrer data", "manage-data-description": "Administrer dine matvarer og enheter (flere alternativer kommer snart)", - "data-migrations": "Datamigrering", + "data-migrations": "Dataoverføringer", "data-migrations-description": "Overfør eksisterende data fra andre programmer som Nextcloud Recipes og Chowdown", "email-sent": "Epost sendt", "error-sending-email": "Feil ved sending av e-post", @@ -1157,13 +1157,13 @@ "show-advanced-description": "Vis avanserte funksjoner (API-nøkler, webhooks og databehandling)", "back-to-profile": "Tilbake til profil", "looking-for-privacy-settings": "Leter du etter personverninnstillinger?", - "manage-your-api-tokens": "Håndter dine API-tokens", + "manage-your-api-tokens": "Administrer dine API-tokens", "manage-user-profile": "Administrer brukerprofil", "manage-cookbooks": "Administrere kokebøker", "manage-members": "Administrer medlemmer", "manage-webhooks": "Administrer webhooks", "manage-notifiers": "Behandle varslere", - "manage-data-migrations": "Håndter datamigreringer" + "manage-data-migrations": "Administrer dataoverføringer" }, "cookbook": { "cookbooks": "Kokebøker", From 36712cdb14638f2fa2cd3f6b07ec818a3ce963ad Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sat, 16 Dec 2023 15:58:32 -0600 Subject: [PATCH 05/68] New Crowdin updates (#2855) * New translations en-us.json (Italian) * New translations en-us.json (Norwegian) * New translations en-us.json (Portuguese) --- frontend/lang/messages/it-IT.json | 2 +- frontend/lang/messages/no-NO.json | 206 +++++++++++++++--------------- frontend/lang/messages/pt-PT.json | 2 +- 3 files changed, 105 insertions(+), 105 deletions(-) diff --git a/frontend/lang/messages/it-IT.json b/frontend/lang/messages/it-IT.json index 881529568472..08f8232331a7 100644 --- a/frontend/lang/messages/it-IT.json +++ b/frontend/lang/messages/it-IT.json @@ -510,7 +510,7 @@ "how-did-it-turn-out": "Come è venuto?", "user-made-this": "{user} l'ha preparato", "last-made-date": "Ultima Preparazione {date}", - "api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.", + "api-extras-description": "Le opzioni extra delle ricette sono una caratteristica fondamentale dell'API Mealie. Consentono di creare json personalizzati con coppie di chiavi/valore all'interno di una ricetta a cui fare riferimento tramite applicazioni terze. È possibile utilizzare queste chiavi per inserire informazioni, per esempio per attivare automazioni oppure per inoltrare messaggi personalizzati al dispositivo desiderato.", "message-key": "Chiave Messaggio", "parse": "Analizza", "attach-images-hint": "Allega immagini trascinandole nell'editor", diff --git a/frontend/lang/messages/no-NO.json b/frontend/lang/messages/no-NO.json index 671e772c6a64..e19ae632b24d 100644 --- a/frontend/lang/messages/no-NO.json +++ b/frontend/lang/messages/no-NO.json @@ -46,7 +46,7 @@ "category-updated": "Kategori oppdatert", "uncategorized-count": "Ukategorisert {count}", "create-a-category": "Opprett en kategori", - "category-name": "Katergorinavn", + "category-name": "Navn på kategori", "category": "Kategori" }, "events": { @@ -65,10 +65,10 @@ "subscribed-events": "Abonnerte hendelser", "test-message-sent": "Testmelding sendt", "new-notification": "Ny varsel", - "event-notifiers": "Hendelsesvarslere", + "event-notifiers": "Hendelsesvarsler", "apprise-url-skipped-if-blank": "Apprise URL (hoppes over hvis tom)", "enable-notifier": "Aktiver varsleren", - "what-events": "Hvilke hendelser denne varsleren abonnere på?", + "what-events": "Hvilke hendelser skal denne varslingsagenten abonnere på?", "user-events": "Brukerhendelser", "mealplan-events": "Måltidsplanleggerhendelser", "when-a-user-in-your-group-creates-a-new-mealplan": "Når en bruker i gruppen din oppretter en ny måltidsplan", @@ -122,7 +122,7 @@ "message": "Melding", "monday": "Mandag", "name": "Navn", - "new": "Ny", + "new": "Legg til", "never": "Aldri", "no": "Nei", "no-recipe-found": "Ingen oppskrift funnet", @@ -180,7 +180,7 @@ "delete-with-name": "Slett {name}", "confirm-delete-generic-with-name": "Er du sikker på at du vil slette denne {name}?", "confirm-delete-own-admin-account": "Vær oppmerksom på at du holder på å slette din egen administrator-konto! Dette kan ikke angres og vil slette kontoen din permanent!", - "organizer": "Planlegger", + "organizer": "Organisator", "transfer": "Overfør", "copy": "Kopiér", "color": "Farge", @@ -251,7 +251,7 @@ "report": "Rapport", "report-with-id": "Rapport-ID: {id}", "group-management": "Gruppeadministrasjon", - "admin-group-management": "Admin gruppeadministrasjon", + "admin-group-management": "Gruppeadministrasjon", "admin-group-management-text": "Endringer i denne gruppen vil gjenspeiles umiddelbart.", "group-id-value": "Gruppe-ID: {0}" }, @@ -264,12 +264,12 @@ "end-date": "Sluttdato", "group": "Gruppe (Beta)", "main": "Hovedrett", - "meal-planner": "Planlegg måltid", + "meal-planner": "Måltidsplanlegger", "meal-plans": "Måltidsplaner", "mealplan-categories": "MÅLTIDSPLANKATEGORIER", "mealplan-created": "Måltidsplan opprettet", "mealplan-creation-failed": "Opprettelse av måltidsplan mislyktes", - "mealplan-deleted": "Måltidsplan Slettet", + "mealplan-deleted": "Måltidsplan slettet", "mealplan-deletion-failed": "Sletting av måltidsplan mislyktes", "mealplan-settings": "Måltidsplaninnstillinger", "mealplan-update-failed": "Oppdatering av måltidsplan mislyktes", @@ -330,11 +330,11 @@ }, "copymethat": { "description-long": "Mealie kan importere oppskrifter fra Copy Me That. Eksporter oppskrifter i HTML-format, last deretter opp .zip-filen under.", - "title": "Copy Me That oppskriftsbehandler" + "title": "Copy Me That Recipe Manager" }, "paprika": { "description-long": "Mealie kan importere oppskrifter fra Paprika. Eksporter oppskriftene fra Paprika, endre filnavnutvidelsen til .zip og last den opp nedenfor.", - "title": "Paprika oppskriftsbehandler" + "title": "Paprika Recipe Manager" }, "mealie-pre-v1": { "description-long": "Mealie kan importere oppskrifter fra Mealie fra versjoner eldre enn v1.0. Eksporter oppskriftene fra din gamle versjon og last opp zip-filen under. Merk at bare oppskrifter kan importeres fra eksporten.", @@ -342,7 +342,7 @@ }, "tandoor": { "description-long": "Mealie kan importere oppskrifter fra Tandoor. Eksporter dataene i \"Standard\"-formatet, last deretter opp .zip-formatet nedenfor.", - "title": "Tandoor oppskrifter" + "title": "Tandoor Recipes" }, "recipe-data-migrations": "Overføring av oppskrifter", "recipe-data-migrations-explanation": "Oppskrifter kan overføres fra et annet støttet program til Mealie. Dette er en flott måte å komme i gang med Mealie på.", @@ -355,8 +355,8 @@ "paprika-text": "Mealie kan importere oppskrifter fra Paprika. Eksporter oppskriftene fra Paprika, endre filnavnutvidelsen til .zip og last den opp nedenfor.", "mealie-text": "Mealie kan importere oppskrifter fra Mealie fra versjoner eldre enn v1.0. Eksporter oppskriftene fra din gamle versjon og last opp zip-filen under. Merk at bare oppskrifter kan importeres fra eksporten.", "plantoeat": { - "title": "Planlegg å spise", - "description-long": "Mealie kan importere oppskrifter fra plan å spise." + "title": "Plan to Eat", + "description-long": "Mealie kan importere oppskrifter fra Plan to Eat." } }, "new-recipe": { @@ -372,7 +372,7 @@ "recipe-url": "Oppskrifts-URL", "upload-a-recipe": "Last opp oppskrift", "upload-individual-zip-file": "Last opp en individuell .zip-fil eksportert fra en annen Mealie-instans.", - "url-form-hint": "Kopier og lim inn en link fra favorittoppskriftsnettstedet ditt", + "url-form-hint": "Kopier og lim inn en lenke fra nettstedet med favorittoppskriftene dine", "view-scraped-data": "Vis skrapte data", "trim-whitespace-description": "Fjern innledende og etterfølgende mellomrom i tillegg til tomme linjer", "trim-prefix-description": "Fjern første tegn fra hver linje", @@ -423,7 +423,7 @@ "insert-ingredient": "Sett inn ingrediens", "insert-section": "Sett inn avsnitt", "instructions": "Instruksjoner", - "key-name-required": "Nøkkelnavn påkrevd", + "key-name-required": "Navn på nøkkel er påkrevd", "landscape-view-coming-soon": "Landskapsvisning", "milligrams": "mg", "new-key-name": "Nytt nøkkelnavn", @@ -432,7 +432,7 @@ "nutrition": "Ernæring", "object-key": "Objektnøkkel", "object-value": "Objektverdi", - "original-url": "Opprinnlig URL", + "original-url": "URL-addresse til oppskrift", "perform-time": "Koketid", "prep-time": "Forberedelsestid", "protein-content": "Protein", @@ -468,7 +468,7 @@ "date-format-hint-yyyy-mm-dd": "ÅÅÅÅ-MM-DD-format", "add-to-list": "Legg til i liste", "add-to-plan": "Legg til i plan", - "add-to-timeline": "Legg til på tidslinjen", + "add-to-timeline": "Legg til tidslinje", "recipe-added-to-list": "Oppskrift er lagt til i liste", "recipes-added-to-list": "Oppskrifter lagt til listen", "recipe-added-to-mealplan": "Oppskrift er lagt til i måltidsplan", @@ -483,11 +483,11 @@ "toggle-section": "Legg til seksjon", "see-original-text": "Se opprinnelig tekst", "original-text-with-value": "Opprinnelig tekst: {originalText}", - "ingredient-linker": "Ingredienskobler", - "linked-to-other-step": "Koblet til et annet trinn", + "ingredient-linker": "Tilknytt ingredienser", + "linked-to-other-step": "Tilknyttet et annet steg", "auto": "Automatisk", "cook-mode": "Tilberedelsesmodus", - "link-ingredients": "Koble på ingredienser", + "link-ingredients": "Tilknytt ingredienser", "merge-above": "Slå sammen med steget over", "reset-scale": "Nullstill skala", "decrease-scale-label": "Reduser skala med 1", @@ -497,9 +497,9 @@ "timer": { "kitchen-timer": "Kjøkkentimer", "start-timer": "Start nedtelling", - "pause-timer": "Pause nedtellingen", - "resume-timer": "Fortsett nedtellingen", - "stop-timer": "Stopp nedtellingen" + "pause-timer": "Pause nedtelling", + "resume-timer": "Fortsett nedtelling", + "stop-timer": "Stopp nedtelling" }, "edit-timeline-event": "Endre tidslinjehendelser", "timeline": "Tidslinje", @@ -512,8 +512,8 @@ "last-made-date": "Sist laget: {date}", "api-extras-description": "Ekstramaterialer til oppskrifter er en viktig funksjon i Mealie API-en. De lar deg opprette egendefinerte JSON-nøkkel/verdi-par innenfor en oppskrift for å referere fra tredjepartsapplikasjoner. Du kan bruke disse nøklene til å gi informasjon for eksempel for å utløse automatiseringer eller egendefinerte meldinger som skal videreformidles til ønsket enhet.", "message-key": "Meldingsnøkkel", - "parse": "Del opp", - "attach-images-hint": "Legg til bilder ved å dra og slippe dem i editoren", + "parse": "Analyser", + "attach-images-hint": "Fest bilder ved å dra og slippe dem inn i redigereringsverktøyet", "drop-image": "Slipp bilde", "enable-ingredient-amounts-to-use-this-feature": "Aktiver ingrediensmengder for å bruke denne funksjonen", "recipes-with-units-or-foods-defined-cannot-be-parsed": "Oppskrifter med enheter eller matvarer som er definert kan ikke tolkes.", @@ -529,23 +529,23 @@ "bulk-url-import": "Importer flere URL-er", "debug-scraper": "Feilsøk skraper", "create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Opprett en oppskrift ved å angi navnet. Alle oppskrifter må ha unike navn.", - "new-recipe-names-must-be-unique": "Oppskriftsnavn må være unike", - "scrape-recipe": "Hent oppskrift", - "scrape-recipe-description": "Scrape en oppskrift ved url. Angi Url-adressen for nettstedet du vil skrape, Og Mealie vil forsøke å skrape oppskriften fra det området og legge den til i samlingen din.", + "new-recipe-names-must-be-unique": "Navn på oppskrift må være unike", + "scrape-recipe": "Skrap oppskrift", + "scrape-recipe-description": "Skrap en oppskrift ved å bruke URL-en. Oppgi nettadressen til nettstedet du vil skrape, så vil Mealie forsøke å skrape oppskriften fra den siden og legge den til i samlingen din.", "import-original-keywords-as-tags": "Importer originale søkeord som emneord", "stay-in-edit-mode": "Forbli i redigeringsmodus", "import-from-zip": "Importer fra zip-fil", "import-from-zip-description": "Importer en enkelt oppskrift som ble eksportert fra en annen Mealie-instans.", "zip-files-must-have-been-exported-from-mealie": ".zip-filer må ha blitt eksportert fra Mealie", - "create-a-recipe-by-uploading-a-scan": "Lag en oppskrift ved å laste opp en skanning.", + "create-a-recipe-by-uploading-a-scan": "Opprett en oppskrift ved å laste opp en skanning.", "upload-a-png-image-from-a-recipe-book": "Last opp et png-bilde fra en oppskriftsbok", - "recipe-bulk-importer": "Oppskrift masse-import", - "recipe-bulk-importer-description": "Masse-oppskriftsimporten lar deg importere flere oppskrifter samtidig ved å sette i kø på kontrollstedene på bakgrunnen og kjøre oppgaven i bakgrunnen. Dette kan være nyttig ved først å migrere til Mealie, eller når du vil importere et stort antall oppskrifter.", - "set-categories-and-tags": "Sett kategorier og emneord", + "recipe-bulk-importer": "Masseimport av oppskrifter", + "recipe-bulk-importer-description": "Masseimport av oppskrifter lar deg importere flere oppskrifter samtidig ved å sette opp nettstedene i kø på serveren og kjøre oppgaven i bakgrunnen. Dette kan være nyttig når du først migrerer til Mealie, eller når du ønsker å importere et stort antall oppskrifter.", + "set-categories-and-tags": "Angi kategorier og emneord", "bulk-imports": "Masseimport", "bulk-import-process-has-started": "Masseimport har startet", "bulk-import-process-has-failed": "Masseimport mislyktes", - "report-deletion-failed": "Raport sletting feilet", + "report-deletion-failed": "Sletting av rapport mislyktes", "recipe-debugger": "Oppskriftsfeilsøker", "recipe-debugger-description": "Hent URL-adressen til oppskriften du vil feilsøke og lim den inn her. URL-adressen vil bli skrapt av oppskrifts-skraperen og resultatene vil bli vist. Hvis du ikke ser noen data returnert, er ikke nettstedet du prøver å skrape støttet av Mealie eller skraper-biblioteket.", "debug": "Feilsøk", @@ -553,7 +553,7 @@ "recipe-yield": "Utbytte av oppskrift", "unit": "Enhet", "upload-image": "Last opp bilde", - "screen-awake": "Hold skjerm på", + "screen-awake": "Hold skjermen på", "remove-image": "Slett bilde" }, "search": { @@ -623,7 +623,7 @@ "new-page": "Ny side", "notify": "Varsle", "organize": "Organiser", - "page-name": "Sidenavn", + "page-name": "Navn på side", "pages": "Sider", "profile": "Profil", "remove-existing-entries-matching-imported-entries": "Fjern eksisterende oppføringer som samsvarer med de importerte oppføringene", @@ -632,9 +632,9 @@ "settings-updated": "Innstillinger oppdatert", "site-settings": "Sideinnstillinger", "theme": { - "accent": "Utheving", + "accent": "Uthevet", "dark": "Mørk", - "default-to-system": "Standard", + "default-to-system": "Systemstandard", "error": "Feil", "error-creating-theme-see-log-file": "Feil under oppretting av tema. Se loggfil.", "error-deleting-theme": "Feil ved sletting av tema", @@ -643,11 +643,11 @@ "light": "Lys", "primary": "Primær", "secondary": "Sekundær", - "success": "Fullført", + "success": "Suksess", "switch-to-dark-mode": "Bytt til mørk modus", "switch-to-light-mode": "Bytt til lys modus", "theme-deleted": "Tema slettet", - "theme-name": "Temanavn", + "theme-name": "Navn på tema", "theme-name-is-required": "Navn på tema er påkrevd.", "theme-saved": "Tema lagret", "theme-updated": "Tema oppdatert", @@ -661,7 +661,7 @@ "api-tokens": "API-tokener", "copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Kopier dette tokenet til bruk med et eksternt program. Dette tokenet vil ikke kunne ses igjen.", "create-an-api-token": "Opprett et API-token", - "token-name": "Tokennavn", + "token-name": "Navn på token", "generate": "Opprett", "you-have-token-count": "Du har ingen aktive token.|Du har ett aktivt token.|Du har {count} aktive tokener." }, @@ -683,7 +683,7 @@ "webhooks-caps": "WEBHOOKS", "webhooks": "Webhooks", "webhook-name": "Navn på webhook", - "description": "Webhooks definert nedenfor vil utføres når et måltid defineres for dagen. På det planlagte tidspunktet blir webhook sendt med data fra oppskriften som er planlagt for dagen. Merke at av tidspunktet ikke er nøyaktig, webhooks utføres med et intervall på 5 minutter, dette betyr at webhooks utføres innen +/- 5 minutter etter planlagt tidspunkt." + "description": "Webhooks definert nedenfor vil utføres når et måltid defineres for dagen. På det planlagte tidspunktet blir webhook sendt med data fra oppskriften som er planlagt for dagen. Merk at tidspunktet ikke er nøyaktig og webhooks utføres med et intervall på 5 minutter. Dette betyr at webhooks utføres innenfor +/- 5 minutter etter planlagt tidspunkt." }, "bug-report": "Feilrapport", "bug-report-information": "Bruk denne informasjonen til å rapportere en feil. Å gi detaljer om installasjonen din til utviklerne er den beste måten å få løst problemene dine raskt på.", @@ -691,15 +691,15 @@ "configuration": "Konfigurasjon", "docker-volume": "Docker-volum", "docker-volume-help": "Mealie krever at frontend- og backend-konteinerene deler samme docker-volum eller lagringssted. Dette sikrer at frontend-kontaineren får tilgang til bilder og ressurser lagret på harddisken.", - "volumes-are-misconfigured": "Volumene er feilkonfigurert.", + "volumes-are-misconfigured": "Volumene er konfigurert feil.", "volumes-are-configured-correctly": "Volumene er riktig konfigurert.", "status-unknown-try-running-a-validation": "Statusen er ukjent. Prøv å kjør en validering.", "validate": "Valider", - "email-configuration-status": "E-postkonfigurasjonsstatus", + "email-configuration-status": "Status på konfigurasjon av e-post", "email-configured": "E-post konfigurert", - "email-test-results": "Email Test Results", + "email-test-results": "Testresultater for e-post", "ready": "Klar", - "not-ready": "Ikke klar - sjekk miljøvariabler", + "not-ready": "Ikke klar - kontroller konfigurasjonen", "succeeded": "Lyktes", "failed": "Mislyktes", "general-about": "Generelt om", @@ -708,15 +708,15 @@ "mealie-is-up-to-date": "Mealie er oppdatert", "secure-site": "Sikkert nettsted", "secure-site-error-text": "Server via localhost eller sikre med https. Utklippstavle og ytterlige nettleser-API-er vil muligens ikke fungere.", - "secure-site-success-text": "Tjenesten er tilgjengelig på localhost eller https", - "server-side-base-url": "Serverens sidebase URL", + "secure-site-success-text": "Tjenesten er tilgjengelig via localhost eller https", + "server-side-base-url": "Serverens URL", "server-side-base-url-error-text": "`BASE_URL` er fortsatt standardverdien på API-serveren. Dette vil forårsake problemer med varslingslenker som genereres på serveren for e-post osv.", "server-side-base-url-success-text": "Serverside-URL samsvarer ikke med standard", "ldap-ready": "LDAP klar", "ldap-ready-error-text": "Ikke alle LDAP-verdier er konfigurert. Dette kan ignoreres hvis du ikke bruker LDAP-autentisering.", "ldap-ready-success-text": "Alle obligratoriske LDAP-variabler er satt.", "build": "Build", - "recipe-scraper-version": "OppskriftsScraper versjon" + "recipe-scraper-version": "Versjon på oppskrift-scraper" }, "shopping-list": { "all-lists": "Alle lister", @@ -736,12 +736,12 @@ "are-you-sure-you-want-to-delete-this-item": "Er du sikker på at du vil slette dette elementet?", "copy-as-text": "Kopier som tekst", "copy-as-markdown": "Kopier som Markdown", - "delete-checked": "Slett avkrysset", + "delete-checked": "Fjern markerte elementer", "toggle-label-sort": "Bytt etikettsortering", "reorder-labels": "Omorganiser etiketter", - "uncheck-all-items": "Fjern merking av alle elementer", + "uncheck-all-items": "Fjern markering av alle elementer", "check-all-items": "Marker alle elementer", - "linked-recipes-count": "Ingen lenkede oppskrifter|En lenket oppskrift|{count} Lenkede oppskrifter", + "linked-recipes-count": "Ingen tilknyttede oppskrifter|En tilknyttet oppskrift|{count} tilknyttede oppskrifter", "items-checked-count": "Ingen elementer krysset av|Ett element krysset av|{count} elementer krysset av", "no-label": "Ingen etikett", "completed-on": "Fullført den {date}" @@ -803,12 +803,12 @@ "admin": "Administrator", "are-you-sure-you-want-to-delete-the-link": "Er du sikker på at du vil slette lenken {link}?", "are-you-sure-you-want-to-delete-the-user": "Er du sikker på at du vil slette brukeren {activeName} ID: {activeId}?", - "auth-method": "Autentisering metode", + "auth-method": "Autentiseringsmetode", "confirm-link-deletion": "Bekreft sletting av lenke", "confirm-password": "Bekreft passord", "confirm-user-deletion": "Bekreft sletting av bruker", "could-not-validate-credentials": "Kunne ikke validere påloggingsinformasjon", - "create-link": "Opprett link", + "create-link": "Opprett lenke", "create-user": "Opprett bruker", "current-password": "Gjeldende passord", "e-mail-must-be-valid": "E-post må være gyldig", @@ -817,7 +817,7 @@ "error-cannot-delete-super-user": "Feil! Kan ikke slette superbruker", "existing-password-does-not-match": "Eksisterende passord samsvarer ikke", "full-name": "Fullt navn", - "generate-password-reset-link": "Generer kobling for tilbakestilling av passord", + "generate-password-reset-link": "Generer lenke for tilbakestilling av passord", "invite-only": "Kun inviterte", "link-id": "Lenke-ID", "link-name": "Lenkenavn", @@ -832,7 +832,7 @@ "password-updated": "Passord oppdatert", "password": "Passord", "password-strength": "Passordet er {strength}", - "please-enter-password": "Angi nytt passord.", + "please-enter-password": "Vennligst angi nytt passord.", "register": "Registrér", "reset-password": "Tilbakestill passord", "sign-in": "Logg inn", @@ -854,7 +854,7 @@ "users-header": "BRUKERE", "users": "Brukere", "user-not-found": "Bruker ikke funnet", - "webhook-time": "Webhooks Tidsbruk", + "webhook-time": "Webhook-tid", "webhooks-enabled": "Webhooks aktivert", "you-are-not-allowed-to-create-a-user": "Du har ikke rettigheter til å opprette en bruker", "you-are-not-allowed-to-delete-this-user": "Du har ikke rettigheter til å slette denne brukeren", @@ -863,7 +863,7 @@ "favorite-recipes": "Favorittoppskrifter", "email-or-username": "E-post eller brukernavn", "remember-me": "Husk meg", - "please-enter-your-email-and-password": "Vennligst angi brukernavnet og passordet ditt", + "please-enter-your-email-and-password": "Vennligst angi ditt brukernavn og passord", "invalid-credentials": "Ugyldig brukerinformasjon", "account-locked-please-try-again-later": "Kontoen er låst. Prøv igjen senere", "user-favorites": "Brukerfavoritter", @@ -874,14 +874,14 @@ "very-strong": "Veldig sterkt" }, "user-management": "Brukeradministrasjon", - "reset-locked-users": "Tilbakestille låste brukere", - "admin-user-creation": "Admin bruker oppretting", - "admin-user-management": "Admin User Management", + "reset-locked-users": "Tilbakestill låste brukere", + "admin-user-creation": "Opprett administratorkonto", + "admin-user-management": "Brukeradministrasjon", "user-details": "Brukerdetaljer", "user-name": "Brukernavn", "authentication-method": "Autentiseringsmetode", "authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie", - "permissions": "Tillatelser", + "permissions": "Rettigheter", "administrator": "Administrator", "user-can-invite-other-to-group": "Brukeren kan invitere andre til gruppe", "user-can-manage-group": "Brukeren kan administrere gruppe", @@ -902,7 +902,7 @@ }, "data-pages": { "foods": { - "merge-dialog-text": "Ved å kombinere de valgte matvarene, vil de bli slått sammen til én matvare. Den første matvaren vil bli slettet, og alle referanser til denne vil bli oppdatert til å peke til den nye matvaren.", + "merge-dialog-text": "Ved å kombinere de valgte matvarene vil de bli slått sammen til én matvare. Den første matvaren vil bli slettet, og alle referanser til denne vil bli oppdatert til å peke til den nye matvaren.", "merge-food-example": "Slår sammen {food1} til {food2}", "seed-dialog-text": "Legg til matvarer i databasen basert på ditt lokale språk. Dette vil opprette 200+ vanlige matvarer som kan brukes til å organisere databasen din. Matvarene oversettes via en fellesinnsats fra samfunnet.", "seed-dialog-warning": "Du har allerede noen elementer i databasen din. Denne handlingen vil ikke forene duplikater, du må håndtere dem manuelt.", @@ -913,30 +913,30 @@ "food-label": "Matvareetikett", "edit-food": "Rediger matvare", "food-data": "Matvaredata", - "example-food-singular": "f. eks. løk", - "example-food-plural": "f. eks. løk" + "example-food-singular": "f.eks: tomat", + "example-food-plural": "f.eks: tomater" }, "units": { "seed-dialog-text": "Tilfør typiske enheter i databasen basert på ditt lokale språk.", - "combine-unit-description": "Ved å kombinere de valgte enhetene vil kildeenheten og målenheten slås sammen i en enkelt enhet. {source-unit-will-be-deleted} og alle referansene til kildeenheten vil bli oppdatert til å peke til målenheten.", + "combine-unit-description": "Ved å kombinere de valgte enhetene, vil de bli slått sammen til én enkelt enhet. {source-unit-will-be-deleted} og alle referanser til denne vil bli oppdatert til å peke til den nye enheten.", "combine-unit": "Kombiner enhet", "source-unit": "Kildeenhet", "target-unit": "Målenhet", "merging-unit-into-unit": "Slår sammen {0} til {1}", "create-unit": "Opprett enhet", "abbreviation": "Forkortelse", - "plural-abbreviation": "Flertallsforkortelse", + "plural-abbreviation": "Forkortet flertallsform", "description": "Beskrivelse", - "display-as-fraction": "Vis som brøkdel", + "display-as-fraction": "Vis som brøk", "use-abbreviation": "Bruk forkortelse", "edit-unit": "Rediger enhet", "unit-data": "Enhetsdata", - "use-abbv": "Bruk forkortelse.", + "use-abbv": "Bruk forkortelse", "fraction": "Brøk", - "example-unit-singular": "Feks: Spiseskje", - "example-unit-plural": "Feks: Spiseskjeer", - "example-unit-abbreviation-singular": "Feks: SS", - "example-unit-abbreviation-plural": "Feks: SS" + "example-unit-singular": "f.eks: spiseskje", + "example-unit-plural": "f.eks: spiseskjeer", + "example-unit-abbreviation-singular": "f.eks: ss", + "example-unit-abbreviation-plural": "f.eks: ss" }, "labels": { "seed-dialog-text": "Tilfør typiske etiketter i databasen basert på ditt lokale språk.", @@ -946,16 +946,16 @@ }, "recipes": { "purge-exports": "Fjern eksporter", - "are-you-sure-you-want-to-delete-all-export-data": "Er du sikker på at du vil slette all historikk?", - "confirm-delete-recipes": "Er du sikker på at du vil slette denne oppskriften? Denne handlingen kan ikke angres.", + "are-you-sure-you-want-to-delete-all-export-data": "Er du sikker på at du vil slette alle eksporterte data?", + "confirm-delete-recipes": "Er du sikker på at du vil slette følgende oppskrifter? Denne handlingen kan ikke angres.", "the-following-recipes-selected-length-will-be-exported": "Følgende oppskrifter ({0}) vil bli eksportert.", - "settings-chosen-explanation": "Innstillinger valgt her, bortsett fra det låste alternativet, vil bli brukt på alle valgte oppskrifter.", + "settings-chosen-explanation": "Innstillinger som valgt her, bortsett fra det låste alternativet, vil bli brukt på alle valgte oppskrifter.", "selected-length-recipe-s-settings-will-be-updated": "Innstillingene til {count} oppskrift(er) vil bli oppdatert.", "recipe-data": "Oppskriftsdata", "recipe-data-description": "Bruk denne delen til å administrere dataene knyttet til oppskriftene dine. Du kan utføre flere massehandlinger på oppskriftene dine, inkludert eksportering, sletting, merking og tildeling av kategorier.", "recipe-columns": "Oppskriftskolonner", - "data-exports-description": "Dette avsnittet gir lenker til tilgjengelige eksportfiler som er klare til nedlasting. Disse eksportfilene utløper, så sørg for å laste dem ned mens de fortsatt er tilgjengelige.", - "data-exports": "Data eksport", + "data-exports-description": "Her finner du lenker til tilgjengelige eksportfiler som er klare til nedlasting. Disse eksportfilene utløper, så sørg for å laste dem ned mens de fortsatt er tilgjengelige.", + "data-exports": "Dataeksport", "tag": "Emneord", "categorize": "Kategoriser", "update-settings": "Oppdater innstillinger", @@ -970,14 +970,14 @@ "seed-data": "Tilføringsdata", "seed": "Nøkkel", "data-management": "Databehandling", - "data-management-description": "Velg hvilke data du vil gjøre endringer i.", + "data-management-description": "Velg hvilke data du vil gjøre endringer på.", "select-data": "Velg data", "select-language": "Velg språk", "columns": "Kolonner", "combine": "Kombiner", "categories": { "edit-category": "Rediger kategori", - "new-category": "Ny Kategori", + "new-category": "Ny kategori", "category-data": "Kategoridata" }, "tags": { @@ -1049,7 +1049,7 @@ "flatten": "Flat ut uavhengig av orginalformatering", "help": { "help": "Hjelp", - "mouse-modes": "Musemodus", + "mouse-modes": "Musemoduser", "selection-mode": "Markeringsmodus (standard)", "selection-mode-desc": "Markeringsmodusen er hovedmodusen som kan brukes til å legge inn data:", "selection-mode-steps": { @@ -1078,9 +1078,9 @@ "button-label-get-summary": "Hent sammendrag", "button-label-open-details": "Detaljer", "info-description-data-dir-size": "Størrelse på datamappe", - "info-description-log-file-size": "Loggfil størrelse", - "info-description-cleanable-directories": "Rensbare kataloger", - "info-description-cleanable-images": "Rydbare bilder", + "info-description-log-file-size": "Størrelse på loggfil", + "info-description-cleanable-directories": "Mapper som kan ryddes i", + "info-description-cleanable-images": "Ryddbare bilder", "storage": { "title-temporary-directory": "Midlertidig mappe (.temp)", "title-backups-directory": "Mappe for sikkerhetskopier (backups)", @@ -1091,7 +1091,7 @@ "action-delete-log-files-name": "Slett loggfiler", "action-delete-log-files-description": "Sletter alle loggfilene", "action-clean-directories-name": "Fjern kataloger", - "action-clean-directories-description": "Fjerner alle oppskriftsmapper som ikke er gyldige UUIDer", + "action-clean-directories-description": "Fjerner alle oppskriftsmapper som ikke er gyldige UUID-er", "action-clean-temporary-files-name": "Fjern midlertidige filer", "action-clean-temporary-files-description": "Fjerner alle filer og mapper i .temp-mappen", "action-clean-images-name": "Fjern bilder", @@ -1100,69 +1100,69 @@ "actions-description-destructive": "destruktiv", "actions-description-irreversible": "irreversibel", "logs-action-refresh": "Oppdater logger", - "logs-page-title": "Mealie Log", + "logs-page-title": "Mealie log", "logs-tail-lines-label": "Siste linjer" }, "mainentance": { "actions-title": "Handlinger" }, - "ingredients-natural-language-processor": "Ingredients Natural Language Processor", - "ingredients-natural-language-processor-explanation": "Mealie bruker Conditional Random Fields (CRFs) for å analysere og behandle ingredienser. Modellen som brukes til ingredienser, er basert på et datasett med over 100 000 ingredienser satt sammen av New York Times. Vær oppmerksom på at siden modellen kun er trent på engelsk, kan resultatene variere når du bruker modellen på andre språk. Denne siden er en lekeplass for å teste modellen.", + "ingredients-natural-language-processor": "Naturlig språkprossesering for ingredienser", + "ingredients-natural-language-processor-explanation": "Mealie bruker Conditional Random Fields (CRFs) for å analysere og behandle ingredienser. Modellen som brukes til ingredienser er basert på et datasett med over 100 000 ingredienser satt sammen av New York Times. Vær oppmerksom på at siden modellen kun er trent på engelsk, kan resultatene variere når du bruker modellen på andre språk. På denne siden kan du teste modellen.", "ingredients-natural-language-processor-explanation-2": "Modellen er ikke perfekt, men det gir generelt sett gode resultater og er et godt utgangspunkt for å manuelt analysere ingredienser i individuelle felt. Alternativt kan du også bruke 'Brute'-prosessoren som bruker mønstergjenkjennelsesteknikker for å identifisere ingredienser.", "nlp": "NLP", "brute": "Brute", - "show-individual-confidence": "Vis individuell tillit", - "ingredient-text": "Ingredient tekst", + "show-individual-confidence": "Vis individuell konfidens", + "ingredient-text": "Ingredienstekst", "average-confident": "{0} Troverdig", "try-an-example": "Prøv et eksempel", "parser": "Parser", "background-tasks": "Bakgrunnsoppgaver", - "background-tasks-description": "Her kan du se alle aktive bakgrunnsoppgaver og deres status", + "background-tasks-description": "Her kan du se alle de aktive bakgrunnsoppgavene og statusen deres", "no-logs-found": "Ingen logger funnet", "tasks": "Oppgaver" }, "profile": { "welcome-user": "👋 Velkommen, {0}", - "description": "Behandle din profil, oppskrifter og gruppeinnstillinger.", - "get-invite-link": "Få invitasjonslink", + "description": "Administrer din profil, oppskrifter og gruppeinnstillinger.", + "get-invite-link": "Få invitasjonslenke", "get-public-link": "Få offentlig lenke", "account-summary": "Kontosammendrag", - "account-summary-description": "Her er en oppsummering av gruppens informasjon", + "account-summary-description": "Her er en oppsummering av informasjonen til gruppen din", "group-statistics": "Gruppestatistikk", "group-statistics-description": "Gruppestatistikken din gir deg et innblikk i hvordan du bruker Mealie.", "storage-capacity": "Lagringskapasitet", "storage-capacity-description": "Lagringskapasiteten er en beregning av bildene og ressursene du har lastet opp.", "personal": "Personlig", - "personal-description": "Dette er innstillingene som er personlige for deg. Endringer her påvirker ikke andre brukere", + "personal-description": "Dette er innstillingene som er personlige for deg. Endringer gjort her påvirker ikke andre brukere", "user-settings": "Brukerinnstillinger", "user-settings-description": "Administrer innstillingene, endre passordet og oppdater e-postadressen din", "api-tokens-description": "Administrer dine API-tokens for tilgang fra eksterne programmer", - "group-description": "Disse elementene deles innad i gruppen din. Å redigere ett av dem vil endre det for hele gruppen!", + "group-description": "Disse elementene deles innad i gruppen din. Redigering av elementenee vil føre til endringer for hele gruppen!", "group-settings": "Gruppeinnstillinger", - "group-settings-description": "Administrer felles gruppeinnstillinger som måltidsplan- og personverninnstillinger.", + "group-settings-description": "Administrer felles gruppeinnstillinger som innstillinger for måltidsplaner og personvern.", "cookbooks-description": "Administrer en samling av oppskriftskategorier og generer sider for dem.", "members": "Medlemmer", - "members-description": "Se hvem som er i gruppen din og adminstrer deres tillatelser.", - "webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.", - "notifiers": "Varslere", + "members-description": "Se hvem som er medlem av gruppen din og adminstrer deres rettigheter.", + "webhooks-description": "Sett opp webhooks som utløses på dager du har planlagt måltidsplaner.", + "notifiers": "Varslingsagenter", "notifiers-description": "Sett opp e-post- og pushvarsler som utløses av spesifikke hendelser.", "manage-data": "Administrer data", "manage-data-description": "Administrer dine matvarer og enheter (flere alternativer kommer snart)", "data-migrations": "Dataoverføringer", "data-migrations-description": "Overfør eksisterende data fra andre programmer som Nextcloud Recipes og Chowdown", - "email-sent": "Epost sendt", + "email-sent": "E-post sendt", "error-sending-email": "Feil ved sending av e-post", - "personal-information": "Personlig Informasjon", + "personal-information": "Personlig informasjon", "preferences": "Preferanser", "show-advanced-description": "Vis avanserte funksjoner (API-nøkler, webhooks og databehandling)", "back-to-profile": "Tilbake til profil", "looking-for-privacy-settings": "Leter du etter personverninnstillinger?", "manage-your-api-tokens": "Administrer dine API-tokens", "manage-user-profile": "Administrer brukerprofil", - "manage-cookbooks": "Administrere kokebøker", + "manage-cookbooks": "Administrer kokebøker", "manage-members": "Administrer medlemmer", "manage-webhooks": "Administrer webhooks", - "manage-notifiers": "Behandle varslere", + "manage-notifiers": "Administrer varslingsagenter", "manage-data-migrations": "Administrer dataoverføringer" }, "cookbook": { diff --git a/frontend/lang/messages/pt-PT.json b/frontend/lang/messages/pt-PT.json index bd1277c86db5..1c83927ee84a 100644 --- a/frontend/lang/messages/pt-PT.json +++ b/frontend/lang/messages/pt-PT.json @@ -114,7 +114,7 @@ "json": "JSON", "keyword": "Palavra-chave", "link-copied": "Ligação copiada", - "loading": "Loading", + "loading": "A carregar", "loading-events": "A carregar Eventos", "loading-recipe": "A carregar receita...", "loading-ocr-data": "A carregar dados OCR...", From 1d72178b93e1afff8a959e7f4294936cc9a27d07 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sun, 17 Dec 2023 16:03:03 -0600 Subject: [PATCH 06/68] New translations en-us.json (Bulgarian) --- frontend/lang/messages/bg-BG.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/lang/messages/bg-BG.json b/frontend/lang/messages/bg-BG.json index 154af8442fdc..3e744edd4f08 100644 --- a/frontend/lang/messages/bg-BG.json +++ b/frontend/lang/messages/bg-BG.json @@ -510,7 +510,7 @@ "how-did-it-turn-out": "Как се получи?", "user-made-this": "{user} направи това", "last-made-date": "Последно приготвена на {date}", - "api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.", + "api-extras-description": "Екстрите за рецепти са ключова характеристика на Mealie API. Те Ви позволяват да създавате персонализирани JSON двойки ключ/стойност в рамките на рецепта, за да ги препращате към други приложения. Можете да използвате тези ключове, за да предоставите информация за задействане на автоматизация или персонализирани съобщения, за препращане към желаното от Вас устройство.", "message-key": "Ключ на съобщението", "parse": "Анализирай", "attach-images-hint": "Прикачете снимки като ги влачете и пуснете в редактора", From 954ee3dc1999519a3e184d56132ce3b9be9e30a7 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sun, 17 Dec 2023 16:03:04 -0600 Subject: [PATCH 07/68] New translations en-us.json (Norwegian) --- frontend/lang/messages/no-NO.json | 48 +++++++++++++++---------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/frontend/lang/messages/no-NO.json b/frontend/lang/messages/no-NO.json index e19ae632b24d..6ac236a19f9e 100644 --- a/frontend/lang/messages/no-NO.json +++ b/frontend/lang/messages/no-NO.json @@ -6,7 +6,7 @@ "api-port": "API-port", "application-mode": "Programmodus", "database-type": "Databasetype", - "database-url": "Database-URL", + "database-url": "URL til database", "default-group": "Standardgruppe", "demo": "Demo", "demo-status": "Demostatus", @@ -67,7 +67,7 @@ "new-notification": "Ny varsel", "event-notifiers": "Hendelsesvarsler", "apprise-url-skipped-if-blank": "Apprise URL (hoppes over hvis tom)", - "enable-notifier": "Aktiver varsleren", + "enable-notifier": "Aktiver varslingsagenten", "what-events": "Hvilke hendelser skal denne varslingsagenten abonnere på?", "user-events": "Brukerhendelser", "mealplan-events": "Måltidsplanleggerhendelser", @@ -128,7 +128,7 @@ "no-recipe-found": "Ingen oppskrift funnet", "ok": "OK", "options": "Alternativer:", - "plural-name": "Flertallsnavn", + "plural-name": "Navn på flertallsform", "print": "Skriv ut", "print-preferences": "Skriv ut innstillinger", "random": "Tilfeldig", @@ -341,7 +341,7 @@ "title": "Mealie Pre v1.0" }, "tandoor": { - "description-long": "Mealie kan importere oppskrifter fra Tandoor. Eksporter dataene i \"Standard\"-formatet, last deretter opp .zip-formatet nedenfor.", + "description-long": "Mealie kan importere oppskrifter fra Tandoor. Eksporter dataene i \"Standard\"-formatet, last deretter opp zip-filen nedenfor.", "title": "Tandoor Recipes" }, "recipe-data-migrations": "Overføring av oppskrifter", @@ -366,10 +366,10 @@ "from-url": "Importer en oppskrift", "github-issues": "GitHub-problemer", "google-ld-json-info": "Google ld+json-informasjon", - "must-be-a-valid-url": "Må være en gyldig URL-adresse", + "must-be-a-valid-url": "Må være en gyldig nettadresse", "paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Lim inn oppskriftsdataene. Hver linje blir behandlet som et element i en liste", "recipe-markup-specification": "Spesifikasjon for oppskriftsmerking", - "recipe-url": "Oppskrifts-URL", + "recipe-url": "Nettadresse til oppskrift", "upload-a-recipe": "Last opp oppskrift", "upload-individual-zip-file": "Last opp en individuell .zip-fil eksportert fra en annen Mealie-instans.", "url-form-hint": "Kopier og lim inn en lenke fra nettstedet med favorittoppskriftene dine", @@ -377,7 +377,7 @@ "trim-whitespace-description": "Fjern innledende og etterfølgende mellomrom i tillegg til tomme linjer", "trim-prefix-description": "Fjern første tegn fra hver linje", "split-by-numbered-line-description": "Forsøk å dele opp et avsnitt ved å matche mønsteret '1)' eller '1.'", - "import-by-url": "Importer en oppskrift via URL", + "import-by-url": "Importer en oppskrift via nettadresse", "create-manually": "Opprett en oppskrift manuelt", "make-recipe-image": "Bruk dette som oppskriftsbilde" }, @@ -432,7 +432,7 @@ "nutrition": "Ernæring", "object-key": "Objektnøkkel", "object-value": "Objektverdi", - "original-url": "URL-addresse til oppskrift", + "original-url": "Nettadresse til oppskrift", "perform-time": "Koketid", "prep-time": "Forberedelsestid", "protein-content": "Protein", @@ -522,16 +522,16 @@ "recipe-creation": "Opprett oppskrift", "select-one-of-the-various-ways-to-create-a-recipe": "Velg en av de ulike måtene å opprette en oppskrift", "looking-for-migrations": "Ser du etter overføringer?", - "import-with-url": "Importer via URL", + "import-with-url": "Importer via nettadresse", "create-recipe": "Opprett oppskrift", "import-with-zip": "Importer fra .zip-fil", "create-recipe-from-an-image": "Opprett oppskrift fra et bilde", - "bulk-url-import": "Importer flere URL-er", + "bulk-url-import": "Importer flere nettadresser", "debug-scraper": "Feilsøk skraper", "create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Opprett en oppskrift ved å angi navnet. Alle oppskrifter må ha unike navn.", "new-recipe-names-must-be-unique": "Navn på oppskrift må være unike", "scrape-recipe": "Skrap oppskrift", - "scrape-recipe-description": "Skrap en oppskrift ved å bruke URL-en. Oppgi nettadressen til nettstedet du vil skrape, så vil Mealie forsøke å skrape oppskriften fra den siden og legge den til i samlingen din.", + "scrape-recipe-description": "Skrap en oppskrift ved bruk av nettadresse. Oppgi nettadressen til nettstedet du vil skrape, så vil Mealie forsøke å skrape oppskriften fra den siden og legge den til i samlingen din.", "import-original-keywords-as-tags": "Importer originale søkeord som emneord", "stay-in-edit-mode": "Forbli i redigeringsmodus", "import-from-zip": "Importer fra zip-fil", @@ -547,7 +547,7 @@ "bulk-import-process-has-failed": "Masseimport mislyktes", "report-deletion-failed": "Sletting av rapport mislyktes", "recipe-debugger": "Oppskriftsfeilsøker", - "recipe-debugger-description": "Hent URL-adressen til oppskriften du vil feilsøke og lim den inn her. URL-adressen vil bli skrapt av oppskrifts-skraperen og resultatene vil bli vist. Hvis du ikke ser noen data returnert, er ikke nettstedet du prøver å skrape støttet av Mealie eller skraper-biblioteket.", + "recipe-debugger-description": "Hent nettadressen til oppskriften du vil feilsøke og lim den inn her. Nettsiden vil bli skrapt og resultatene vil bli vist. Hvis du ikke ser noen data returnert, er ikke nettstedet du prøver å skrape støttet av Mealie eller skraper-biblioteket.", "debug": "Feilsøk", "tree-view": "Trevisning", "recipe-yield": "Utbytte av oppskrift", @@ -667,7 +667,7 @@ }, "toolbox": { "assign-all": "Tildel alle", - "bulk-assign": "Tilordne flere", + "bulk-assign": "Tildel flere", "new-name": "Nytt navn", "no-unused-items": "Ingen ubrukte elementer", "recipes-affected": "Ingen oppskrifter påvirket|En oppskrift påvirket|{count} Oppskrifter påvirket", @@ -791,13 +791,13 @@ "tag-name": "Navn på emneord" }, "tool": { - "tools": "Utstyr", + "tools": "Kjøkkenredskap", "on-hand": "Tillgjengelig", - "create-a-tool": "Opprett utstyr", - "tool-name": "Navn på utstyr", - "create-new-tool": "Opprett nytt utstyr", + "create-a-tool": "Opprett kjøkkenredskap", + "tool-name": "Navn på kjøkkenredskap", + "create-new-tool": "Opprett nytt kjøkkenredskap", "on-hand-checkbox-label": "Vis som tilgjengelig (avmerket)", - "required-tools": "Påkrevd utstyr" + "required-tools": "Påkrevde kjøkkenredskaper" }, "user": { "admin": "Administrator", @@ -820,7 +820,7 @@ "generate-password-reset-link": "Generer lenke for tilbakestilling av passord", "invite-only": "Kun inviterte", "link-id": "Lenke-ID", - "link-name": "Lenkenavn", + "link-name": "Navn på lenke", "login": "Logg på", "logout": "Logg ut", "manage-users": "Administrer brukere", @@ -968,7 +968,7 @@ "create-alias": "Opprett alias", "manage-aliases": "Administrer aliaser", "seed-data": "Tilføringsdata", - "seed": "Nøkkel", + "seed": "Tilfør", "data-management": "Databehandling", "data-management-description": "Velg hvilke data du vil gjøre endringer på.", "select-data": "Velg data", @@ -986,9 +986,9 @@ "tag-data": "Emneorddata" }, "tools": { - "new-tool": "Nytt utstyr", - "edit-tool": "Rediger utstyr", - "tool-data": "Utstyrsdata" + "new-tool": "Nytt kjøkkenredskap", + "edit-tool": "Rediger kjøkkenredskap", + "tool-data": "Kjøkkenredskapsdata" } }, "user-registration": { @@ -1174,7 +1174,7 @@ "filter-options-description": "Når krev alle er valgt, vil kokeboken bare inkludere oppskrifter som har alle de valgte elementene. Dette gjelder for hvert delsett av valgene og ikke et tverrsnitt av de valgte elementene.", "require-all-categories": "Krev alle kategorier", "require-all-tags": "Krev alle emneord", - "require-all-tools": "Krev alt utstyr", + "require-all-tools": "Krev alle kjøkkenredskaper", "cookbook-name": "Navn på kokebok", "cookbook-with-name": "Kokebok {0}" } From 0aba36e17f1cdbb7dbe5edefb0fecf0545c233ee Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sun, 17 Dec 2023 16:03:05 -0600 Subject: [PATCH 08/68] New translations en-us.json (Polish) --- frontend/lang/messages/pl-PL.json | 90 +++++++++++++++---------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/frontend/lang/messages/pl-PL.json b/frontend/lang/messages/pl-PL.json index 1e47366a2954..fbc281820161 100644 --- a/frontend/lang/messages/pl-PL.json +++ b/frontend/lang/messages/pl-PL.json @@ -114,9 +114,9 @@ "json": "JSON", "keyword": "Słowo kluczowe", "link-copied": "Odnośnik skopiowany", - "loading": "Loading", + "loading": "Ładowanie", "loading-events": "Ładowanie wydarzeń", - "loading-recipe": "Loading recipe...", + "loading-recipe": "Ładowanie przepisów...", "loading-ocr-data": "Loading OCR data...", "loading-recipes": "Ładowanie przepisów", "message": "Wiadomość", @@ -128,7 +128,7 @@ "no-recipe-found": "Nie znaleziono przepisu", "ok": "OK", "options": "Opcje:", - "plural-name": "Plural Name", + "plural-name": "Nazwa w liczbie mnogiej", "print": "Drukuj", "print-preferences": "Właściwości drukowania", "random": "Losowa", @@ -213,7 +213,7 @@ "group-id-with-value": "ID grupy: {groupID}", "group-name": "Nazwa grupy", "group-not-found": "Nie znaleziono grupy", - "group-token": "Group Token", + "group-token": "Token grupy", "group-with-value": "Grupa: {groupID}", "groups": "Grupy", "manage-groups": "Zarządzaj grupami", @@ -249,7 +249,7 @@ "general-preferences": "Ustawienia ogólne", "group-recipe-preferences": "Ustawienia grupy przepisów", "report": "Zgłoś", - "report-with-id": "Report ID: {id}", + "report-with-id": "ID zgłoszenia: {id}", "group-management": "Zarządzanie grupą", "admin-group-management": "Administracja Zarządzanie Grupami", "admin-group-management-text": "Zmiany w tej grupie zostaną natychmiast odzwierciedlone.", @@ -304,7 +304,7 @@ "for-type-meal-types": "dla {0} rodzajów posiłków", "meal-plan-rules": "Zasady planu posiłków", "new-rule": "Nowa reguła", - "meal-plan-rules-description": "You can create rules for auto selecting recipes for your meal plans. These rules are used by the server to determine the random pool of recipes to select from when creating meal plans. Note that if rules have the same day/type constraints then the categories of the rules will be merged. In practice, it's unnecessary to create duplicate rules, but it's possible to do so.", + "meal-plan-rules-description": "Możesz tworzyć reguły automatycznego wyboru przepisów dla planów posiłkowych. Te reguły są używane przez serwer do określenia losowej puli przepisów do wyboru podczas tworzenia planów posiłków. Zauważ, że jeśli reguły mają ograniczenia tego samego dnia/typu, kategorie reguł zostaną połączone. W praktyce tworzenie duplikatów reguł jest zbędne, ale jest to możliwe.", "new-rule-description": "Przy tworzeniu nowej reguły dotyczącej planu posiłków można ograniczyć regułę, tak aby miała zastosowanie do określonego dnia tygodnia i/lub określonego rodzaju posiłku. Aby zastosować regułę do wszystkich dni lub wszystkich rodzajów posiłków można ustawić regułę na \"Dowolny\", co będzie miało zastosowanie do wszystkich możliwych wartości dla dnia i/lub typu posiłku.", "recipe-rules": "Reguły przepisów", "applies-to-all-days": "Dotyczy wszystkich dni", @@ -341,8 +341,8 @@ "title": "Mealie Pre v1.0" }, "tandoor": { - "description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.", - "title": "Tandoor Recipes" + "description-long": "Mealie może zaimportować przepisy z Tandoor. Wyeksportuj swoje przepisy w formacie HTML, a następnie prześlij plik .zip poniżej.", + "title": "Przepisy Tandoor" }, "recipe-data-migrations": "Migracja danych przepisów", "recipe-data-migrations-explanation": "Receptury mogą być przeniesione z innej wspieranej aplikacji na Mealie. To świetny sposób na rozpoczęcie z Mealie.", @@ -355,8 +355,8 @@ "paprika-text": "Mealie może importować przepisy z aplikacji Paprika. Eksportuj swoje przepisy z papriki, zmień nazwę rozszerzenia eksportu na .zip i prześlij je poniżej.", "mealie-text": "Mealie może importować receptury z aplikacji Mealie z wersji przed v1.0. Wyeksportuj swoje przepisy ze starej instancji i prześlij plik zip poniżej. Pamiętaj, że tylko receptury mogą być zaimportowane z eksportu.", "plantoeat": { - "title": "Plan to Eat", - "description-long": "Mealie can import recipies from Plan to Eat." + "title": "Zaplanuj jedzenie", + "description-long": "Mealie może importować przepisy z Plan to Eat." } }, "new-recipe": { @@ -468,11 +468,11 @@ "date-format-hint-yyyy-mm-dd": "Format RRRR-MM-DD", "add-to-list": "Dodaj do listy", "add-to-plan": "Dodaj do planu", - "add-to-timeline": "Add to Timeline", + "add-to-timeline": "Dodaj do osi czasu", "recipe-added-to-list": "Przepis dodany do listy", "recipes-added-to-list": "Przepisy dodane do listy", "recipe-added-to-mealplan": "Przepis dodany do planu posiłków", - "failed-to-add-recipes-to-list": "Failed to add recipe to list", + "failed-to-add-recipes-to-list": "Nie udało się dodać przepisu do listy", "failed-to-add-recipe-to-mealplan": "Nie udało się dodać przepisu do planu posiłków", "yield": "Wydajność", "quantity": "Ilość", @@ -495,10 +495,10 @@ "locked": "Zablokowany", "public-link": "Link publiczny", "timer": { - "kitchen-timer": "Kitchen Timer", + "kitchen-timer": "Minutnik", "start-timer": "Włącz minutnik", - "pause-timer": "Pause Timer", - "resume-timer": "Resume Timer", + "pause-timer": "Zatrzymaj minutnik", + "resume-timer": "Wznów minutnik", "stop-timer": "Zatrzymaj minutnik" }, "edit-timeline-event": "Edytuj zdarzenie osi czasu", @@ -510,11 +510,11 @@ "how-did-it-turn-out": "Jak się to udało?", "user-made-this": "{user} ugotował(a) to", "last-made-date": "Ostatnio ugotowano {date}", - "api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.", + "api-extras-description": "Dodatki w przepisach są kluczową cechą API Mealie. Pozwalają na tworzenie niestandardowych par kluczy/wartości JSON w przepisie do odwoływania się przez zewnętrzne aplikacje. Możesz użyć tych kluczy do wyzwalania automatyzacji lub przekazywania niestandardowych wiadomości do twoich wybranych urządzeń.", "message-key": "Klucz Wiadomości", "parse": "Analizuj", "attach-images-hint": "Dołącz obrazy przeciągając i upuszczając je do edytora", - "drop-image": "Drop image", + "drop-image": "Upuść zdjęcie", "enable-ingredient-amounts-to-use-this-feature": "Włącz ilości składników, aby użyć tej funkcji", "recipes-with-units-or-foods-defined-cannot-be-parsed": "Nie można przeanalizować przepisów z już zdefiniowanymi jednostkami lub żywnością.", "parse-ingredients": "Analizuj tekst składników", @@ -553,7 +553,7 @@ "recipe-yield": "Wydajność przepisu", "unit": "Jednostka", "upload-image": "Prześlij obraz", - "screen-awake": "Keep Screen Awake", + "screen-awake": "Pozostaw ekran włączony", "remove-image": "Usuń obraz" }, "search": { @@ -573,7 +573,7 @@ "search-hint": "Naciśnij '/'", "advanced": "Zaawansowane", "auto-search": "Auto wyszukiwanie", - "no-results": "No results found" + "no-results": "Nie znaleziono wyników" }, "settings": { "add-a-new-theme": "Dodaj nowy motyw", @@ -582,7 +582,7 @@ "backup-created": "Kopia zapasowa utworzona pomyślnie", "backup-created-at-response-export_path": "Kopia zapasowa została utworzona w {path}", "backup-deleted": "Kopia zapasowa została usunięta", - "restore-success": "Restore successful", + "restore-success": "Przywracanie zakończone sukcesem", "backup-tag": "Etykieta kopii zapasowej", "create-heading": "Utwórz kopię zapasową", "delete-backup": "Usuń kopię zapasową", @@ -691,13 +691,13 @@ "configuration": "Konfiguracja", "docker-volume": "Docker Volume", "docker-volume-help": "Mealie wymaga, aby kontener frontendu i backendu współdzieliły ten sam wolumen docker lub pamięć. Zapewnia to prawidłowy dostęp do zdjęć i zasobów przechowywanych na dysku.", - "volumes-are-misconfigured": "Volumes are misconfigured.", + "volumes-are-misconfigured": "Woluminy są skonfigurowane nieprawidłowo.", "volumes-are-configured-correctly": "Wolumeny są skonfigurowane poprawnie.", "status-unknown-try-running-a-validation": "Status nieznany. Spróbuj wykonać walidację.", "validate": "Sprawdź", "email-configuration-status": "Status konfiguracji Email", - "email-configured": "Email Configured", - "email-test-results": "Email Test Results", + "email-configured": "E-mail skonfigurowany", + "email-test-results": "Wyniki testu e-mail", "ready": "Gotowe", "not-ready": "Niegotowy - Sprawdź zmienne środowiskowe", "succeeded": "Powiodło się", @@ -876,7 +876,7 @@ "user-management": "Zarządzanie użytkownikami", "reset-locked-users": "Zresetuj zablokowanych użytkowników", "admin-user-creation": "Administracja Tworzenie Użytkownika", - "admin-user-management": "Admin User Management", + "admin-user-management": "Zarządzanie użytkownikami", "user-details": "Dane użytkownika", "user-name": "Nazwa użytkownika", "authentication-method": "Sposób uwierzytelniania", @@ -887,11 +887,11 @@ "user-can-manage-group": "Użytkownik może zarządzać grupą", "user-can-organize-group-data": "Użytkownik może organizować dane grupy", "enable-advanced-features": "Włącz zaawansowane funkcje", - "it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.", - "dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!", - "forgot-password": "Forgot Password", - "forgot-password-text": "Please enter your email address and we will send you a link to reset your password.", - "changes-reflected-immediately": "Changes to this user will be reflected immediately." + "it-looks-like-this-is-your-first-time-logging-in": "Wygląda na to, że to jest twoje pierwsze logowanie.", + "dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Nie chcesz już tego widzieć? Pamiętaj, aby zmienić swój adres e-mail w ustawieniach użytkownika!", + "forgot-password": "Nie pamiętam hasła", + "forgot-password-text": "Podaj adres e-mail konta, do którego chcesz odzyskać hasło.", + "changes-reflected-immediately": "Zmiany dla tego użytkownika będą zastosowane natychmiastowo." }, "language-dialog": { "translated": "przetłumaczone", @@ -913,8 +913,8 @@ "food-label": "Etykieta Żywności", "edit-food": "Edytuj Żywność", "food-data": "Dane Żywności", - "example-food-singular": "ex: Onion", - "example-food-plural": "ex: Onions" + "example-food-singular": "np. Cebula", + "example-food-plural": "np. Cebule" }, "units": { "seed-dialog-text": "Wypełnij bazę zwyczajowymi jednostkami dla wybranego języka.", @@ -933,8 +933,8 @@ "unit-data": "Dane Jednostki", "use-abbv": "Użyj Skr.", "fraction": "Ułamki", - "example-unit-singular": "ex: Tablespoon", - "example-unit-plural": "ex: Tablespoons", + "example-unit-singular": "np. Łyżka stołowa", + "example-unit-plural": "np. Łyżki stołowe", "example-unit-abbreviation-singular": "ex: Tbsp", "example-unit-abbreviation-plural": "ex: Tbsps" }, @@ -965,8 +965,8 @@ "delete-recipes": "Usuń Przepisy", "source-unit-will-be-deleted": "Jednostka źródłowa zostanie usunięta" }, - "create-alias": "Create Alias", - "manage-aliases": "Manage Aliases", + "create-alias": "Utwórz alias", + "manage-aliases": "Zarządzaj aliasami", "seed-data": "Dane przykładowe", "seed": "Seed", "data-management": "Zarządzanie Danymi", @@ -982,18 +982,18 @@ }, "tags": { "new-tag": "Nowy Tag", - "edit-tag": "Edit Tag", - "tag-data": "Tag Data" + "edit-tag": "Edytuj tag", + "tag-data": "Dane tagu" }, "tools": { - "new-tool": "New Tool", - "edit-tool": "Edit Tool", - "tool-data": "Tool Data" + "new-tool": "Nowe Narzędzie", + "edit-tool": "Edytuj Narzędzie", + "tool-data": "Dane narzędzia" } }, "user-registration": { "user-registration": "Rejestracja użytkownika", - "registration-success": "Registration Success", + "registration-success": "Rejestracja przebiegła pomyślnie", "join-a-group": "Dołącz do grupy", "create-a-new-group": "Stwórz nową grupę", "provide-registration-token-description": "Podaj kod rejestracyjny powiązany z grupą do której chcesz dołączyć. Taki kod uzyskać możesz od użytkownika który przynależy już do owej grupy.", @@ -1040,7 +1040,7 @@ }, "ocr-editor": { "ocr-editor": "Edytor OCR", - "toolbar": "Toolbar", + "toolbar": "Pasek narzędzi", "selection-mode": "Tryb wyboru", "pan-and-zoom-picture": "Przesuwanie i powiększanie obrazu", "split-text": "Podziel tekst", @@ -1048,8 +1048,8 @@ "split-by-block": "Podziel według bloku tekstowego", "flatten": "Wyrównaj niezależnie od oryginalnego formatowania", "help": { - "help": "Help", - "mouse-modes": "Mouse modes", + "help": "Pomoc", + "mouse-modes": "Tryb myszy", "selection-mode": "Tryb wyboru (domyślny)", "selection-mode-desc": "Tryb wyboru jest głównym trybem, który służy do wprowadzenia danych:", "selection-mode-steps": { @@ -1125,7 +1125,7 @@ "welcome-user": "👋 Witaj, {0}", "description": "Zarządzaj swoim profilem, przepisami i ustawieniami grupy.", "get-invite-link": "Uzyskaj link z zaproszeniem", - "get-public-link": "Get Public Link", + "get-public-link": "Uzyskaj link publiczny", "account-summary": "Podsumowanie konta", "account-summary-description": "Oto podsumowanie informacji o Twojej grupie", "group-statistics": "Statystyki Grupy", From b31647b52b633e25b0736f754007b63f0a6c3c33 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sun, 17 Dec 2023 16:03:07 -0600 Subject: [PATCH 09/68] New translations en-us.json (Chinese Simplified) --- frontend/lang/messages/zh-CN.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/lang/messages/zh-CN.json b/frontend/lang/messages/zh-CN.json index eff982acbf33..1771b74184a4 100644 --- a/frontend/lang/messages/zh-CN.json +++ b/frontend/lang/messages/zh-CN.json @@ -77,7 +77,7 @@ "tag-events": "标签事件", "category-events": "目录事件", "when-a-new-user-joins-your-group": "当新用户加入您的群组时", - "recipe-events": "Recipe Events" + "recipe-events": "食谱事件" }, "general": { "cancel": "取消", @@ -114,9 +114,9 @@ "json": "JSON", "keyword": "关键字", "link-copied": "链接已复制", - "loading": "Loading", + "loading": "正在加载", "loading-events": "正在加载事件", - "loading-recipe": "Loading recipe...", + "loading-recipe": "正在加载食谱...", "loading-ocr-data": "Loading OCR data...", "loading-recipes": "正在加载食谱", "message": "信息", @@ -466,13 +466,13 @@ "entry-type": "条目类型", "date-format-hint": "MM/DD/YYYY 格式", "date-format-hint-yyyy-mm-dd": "YYYY-MM-DD 格式", - "add-to-list": "添加到列表", + "add-to-list": "添加到购物清单", "add-to-plan": "添加到计划", "add-to-timeline": "添加到时间线", - "recipe-added-to-list": "食谱已被添加到列表", - "recipes-added-to-list": "Recipes added to list", + "recipe-added-to-list": "食谱已被添加到购物清单", + "recipes-added-to-list": "食谱已被添加到购物清单", "recipe-added-to-mealplan": "食谱已被添加到用餐计划", - "failed-to-add-recipes-to-list": "Failed to add recipe to list", + "failed-to-add-recipes-to-list": "食谱未能添加到购物清单", "failed-to-add-recipe-to-mealplan": "食谱未能添加到用餐计划", "yield": "Yield", "quantity": "数量", From 0ccbb415b4669bf5ae299f71e1e6ab5a93d05d2d Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sun, 17 Dec 2023 16:03:08 -0600 Subject: [PATCH 10/68] New translations en-us.json (Norwegian) --- mealie/lang/messages/no-NO.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mealie/lang/messages/no-NO.json b/mealie/lang/messages/no-NO.json index 1892d68ee0ea..4fb57f87a1b2 100644 --- a/mealie/lang/messages/no-NO.json +++ b/mealie/lang/messages/no-NO.json @@ -11,7 +11,7 @@ "user": { "user-updated": "Bruker oppdatert", "password-updated": "Passord oppdatert", - "invalid-current-password": "Feil nåværende passord", + "invalid-current-password": "Nåværende passord er feil", "ldap-update-password-unavailable": "Kan ikke oppdatere passordet, brukeren kontrolleres av LDAP" }, "group": { @@ -29,7 +29,7 @@ "generic-updated": "{name} ble oppdatert", "generic-created-with-url": "{name} har blitt opprettet, {url}", "generic-updated-with-url": "{name} har blitt oppdatert, {url}", - "generic-duplicated": "Det er blitt laget kopi av {name}", + "generic-duplicated": "{name} har blitt duplisert", "generic-deleted": "{name} har blitt slettet" } } From aa44fef36f56abcb9e2be7f4cb7a7dee9fa754da Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sun, 17 Dec 2023 16:03:09 -0600 Subject: [PATCH 11/68] New translations en-us.json (Norwegian) --- mealie/repos/seed/resources/foods/locales/no-NO.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mealie/repos/seed/resources/foods/locales/no-NO.json b/mealie/repos/seed/resources/foods/locales/no-NO.json index d9fc4765b50d..ae07840f5010 100644 --- a/mealie/repos/seed/resources/foods/locales/no-NO.json +++ b/mealie/repos/seed/resources/foods/locales/no-NO.json @@ -36,7 +36,7 @@ "butternut-pumpkin": "flaskegresskar", "butternut-squash": "butternut squash", "cactus-edible": "kaktus, spiselig", - "calabrese": "calabrese Fersk Pølse", + "calabrese": "calabrese", "cannabis": "cannabis", "capsicum": "chilipepper", "caraway": "karve", @@ -45,7 +45,7 @@ "cayenne-pepper": "kayenne pepper", "celeriac": "sellerirot", "celery": "selleri", - "cereal-grains": "frokostblanding korn", + "cereal-grains": "frokostblandingkorn", "rice": "ris", "chard": "bladbete", "cheese": "ost", From faf743ecf3201fa7b1f07d75e7501a35d4da52d6 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sun, 17 Dec 2023 16:03:09 -0600 Subject: [PATCH 12/68] New translations en-us.json (Norwegian) --- .../seed/resources/units/locales/no-NO.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/mealie/repos/seed/resources/units/locales/no-NO.json b/mealie/repos/seed/resources/units/locales/no-NO.json index b00c263bb2f8..68e74b1230b2 100644 --- a/mealie/repos/seed/resources/units/locales/no-NO.json +++ b/mealie/repos/seed/resources/units/locales/no-NO.json @@ -15,17 +15,17 @@ "abbreviation": "kopp" }, "fluid-ounce": { - "name": "us væske unse", + "name": "væskeunse", "description": "", "abbreviation": "fl oz" }, "pint": { - "name": "halvliter", + "name": "pint", "description": "", "abbreviation": "pt" }, "quart": { - "name": "quart", + "name": "kvart", "description": "", "abbreviation": "qt" }, @@ -60,27 +60,27 @@ "abbreviation": "g" }, "kilogram": { - "name": "kilo", + "name": "kilogram", "description": "", "abbreviation": "kg" }, "milligram": { - "name": "mg", + "name": "milligram", "description": "", "abbreviation": "mg" }, "splash": { - "name": "splash", + "name": "skvett", "description": "", "abbreviation": "" }, "dash": { - "name": "dash", + "name": "klype", "description": "", "abbreviation": "" }, "serving": { - "name": "servering", + "name": "porsjon", "description": "", "abbreviation": "" }, From e5a19b3a490947e9ae21b784bd200afc19bb1eaa Mon Sep 17 00:00:00 2001 From: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> Date: Tue, 19 Dec 2023 08:18:56 +0000 Subject: [PATCH 13/68] bump recipe-scrapers --- poetry.lock | 8 ++++---- pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3059793799bb..f24ce60a701b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2204,13 +2204,13 @@ tests = ["html5lib", "pytest", "pytest-cov"] [[package]] name = "recipe-scrapers" -version = "14.52.0" +version = "14.53.0" description = "Python package, scraping recipes from all over the internet" optional = false python-versions = ">=3.8" files = [ - {file = "recipe_scrapers-14.52.0-py3-none-any.whl", hash = "sha256:3514048808c7b7de467bfa56bea3921ecff637441cde9085186345e3ce7cabdc"}, - {file = "recipe_scrapers-14.52.0.tar.gz", hash = "sha256:3d1d2cf7ad8c5fd73b5a0e921b3505daeddb42da705ef5c68523a465ccd8cd8f"}, + {file = "recipe_scrapers-14.53.0-py3-none-any.whl", hash = "sha256:330353dc824f9d77a089e4830722fef940a04259a1a59a6578a162378ed6bc72"}, + {file = "recipe_scrapers-14.53.0.tar.gz", hash = "sha256:916e1182fb497b89df8ac29cb816a9566aafc6d2bba73f60462aef42fc1bba22"}, ] [package.dependencies] @@ -3034,4 +3034,4 @@ pgsql = ["psycopg2-binary"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "984d725b667165ebbf82eeea32a38e4f4891192fc8c6be60864d25d5b36e7970" +content-hash = "d7537958ae2ddbf8e2b350cb7b1189492a62b02becfe087efbc37a3b0115ff13" diff --git a/pyproject.toml b/pyproject.toml index b1fba8d7f90d..a94c92a34dfa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,7 +36,7 @@ python-jose = "^3.3.0" python-ldap = "^3.3.1" python-multipart = "^0.0.6" python-slugify = "^8.0.0" -recipe-scrapers = "^14.52.0" +recipe-scrapers = "^14.53.0" requests = "^2.31.0" tzdata = "^2022.7" uvicorn = { extras = ["standard"], version = "^0.21.0" } From fae8484f8425199a87ce8e7c694ef8a53c34b8b2 Mon Sep 17 00:00:00 2001 From: boc-the-git <3479092+boc-the-git@users.noreply.github.com> Date: Tue, 19 Dec 2023 22:42:29 +1100 Subject: [PATCH 14/68] Re-enable cache (#2865) --- .github/workflows/partial-builder.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/partial-builder.yml b/.github/workflows/partial-builder.yml index 46ebc41a9567..2af0f128f714 100644 --- a/.github/workflows/partial-builder.yml +++ b/.github/workflows/partial-builder.yml @@ -59,7 +59,5 @@ jobs: build-args: | COMMIT=${{ github.sha }} # https://docs.docker.com/build/ci/github-actions/cache/#github-cache - # TEMP: Disable cache to possible fix missing LDAP issues - # https://github.com/mealie-recipes/mealie/issues/2847 - # cache-from: type=gha - # cache-to: type=gha,mode=max + cache-from: type=gha + cache-to: type=gha,mode=max From 7222abe244c80d41f690a438be35ea1381b91ee7 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Tue, 19 Dec 2023 21:34:34 -0600 Subject: [PATCH 15/68] security: arbitrary file download by authenticated user (#2867) * restricts download tokens to data directory * block requests outside of the data dir --- mealie/routes/recipe/bulk_actions.py | 6 +++++- mealie/routes/utility_routes.py | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/mealie/routes/recipe/bulk_actions.py b/mealie/routes/recipe/bulk_actions.py index 2682564ca02f..678a157ccfb1 100644 --- a/mealie/routes/recipe/bulk_actions.py +++ b/mealie/routes/recipe/bulk_actions.py @@ -1,7 +1,7 @@ from functools import cached_property from pathlib import Path -from fastapi import APIRouter, Depends +from fastapi import APIRouter, Depends, HTTPException from mealie.core.dependencies.dependencies import temporary_zip_path from mealie.core.security import create_file_token @@ -50,6 +50,10 @@ class RecipeBulkActionsController(BaseUserController): @router.get("/export/download") def get_exported_data_token(self, path: Path): """Returns a token to download a file""" + path = Path(path).resolve() + + if not path.is_relative_to(self.folders.DATA_DIR): + raise HTTPException(400, "path must be relative to data directory") return {"fileToken": create_file_token(path)} diff --git a/mealie/routes/utility_routes.py b/mealie/routes/utility_routes.py index 21496b2e58fc..cc67f348d375 100644 --- a/mealie/routes/utility_routes.py +++ b/mealie/routes/utility_routes.py @@ -3,6 +3,7 @@ from pathlib import Path from fastapi import APIRouter, Depends, HTTPException, status from starlette.responses import FileResponse +from mealie.core.config import get_app_dirs from mealie.core.dependencies import validate_file_token router = APIRouter(prefix="/api/utils", tags=["Utils"], include_in_schema=True) @@ -12,6 +13,14 @@ router = APIRouter(prefix="/api/utils", tags=["Utils"], include_in_schema=True) async def download_file(file_path: Path = Depends(validate_file_token)): """Uses a file token obtained by an active user to retrieve a file from the operating system.""" + + file_path = Path(file_path).resolve() + + dirs = get_app_dirs() + + if not file_path.is_relative_to(dirs.DATA_DIR): + raise HTTPException(status.HTTP_400_BAD_REQUEST) + if not file_path.is_file(): raise HTTPException(status.HTTP_400_BAD_REQUEST) From 86ba7dcf23d3991b74ed1c1acae3ebdb5952f352 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Thu, 21 Dec 2023 05:12:39 -0600 Subject: [PATCH 16/68] New translations en-us.json (Chinese Simplified) --- frontend/lang/messages/zh-CN.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/frontend/lang/messages/zh-CN.json b/frontend/lang/messages/zh-CN.json index 1771b74184a4..fa435e09f130 100644 --- a/frontend/lang/messages/zh-CN.json +++ b/frontend/lang/messages/zh-CN.json @@ -117,7 +117,7 @@ "loading": "正在加载", "loading-events": "正在加载事件", "loading-recipe": "正在加载食谱...", - "loading-ocr-data": "Loading OCR data...", + "loading-ocr-data": "正在加载 OCR 数据...", "loading-recipes": "正在加载食谱", "message": "信息", "monday": "周一", @@ -198,7 +198,7 @@ "refresh": "刷新", "upload-file": "上传文件", "created-on-date": "创建于: {0}", - "unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes." + "unsaved-changes": "你有未保存的更改。你希望现在离开前保存吗?保存选择“是”,不保存选择“取消”。" }, "group": { "are-you-sure-you-want-to-delete-the-group": "您确定要删除{groupName}吗?", @@ -213,7 +213,7 @@ "group-id-with-value": "群组ID: {groupID}", "group-name": "群组名", "group-not-found": "未找到该群组", - "group-token": "Group Token", + "group-token": "群组令牌", "group-with-value": "群组: {groupID}", "groups": "群组", "manage-groups": "管理群组", @@ -504,7 +504,7 @@ "edit-timeline-event": "编辑时间线事件", "timeline": "时间线", "timeline-is-empty": "时间线上空空如也,试着先去制作一个食谱吧!", - "group-global-timeline": "{groupName} Global Timeline", + "group-global-timeline": "{groupName} 全局时间线", "open-timeline": "开启时间线", "made-this": "我做了这个", "how-did-it-turn-out": "成品怎么样?", @@ -883,9 +883,9 @@ "authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie", "permissions": "权限", "administrator": "管理员", - "user-can-invite-other-to-group": "User can invite other to group", - "user-can-manage-group": "User can manage group", - "user-can-organize-group-data": "User can organize group data", + "user-can-invite-other-to-group": "用户可以邀请其他人加入群组", + "user-can-manage-group": "用户可以管理群组", + "user-can-organize-group-data": "用户可以整理群组数据", "enable-advanced-features": "Enable advanced features", "it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.", "dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!", @@ -994,17 +994,17 @@ "user-registration": { "user-registration": "User Registration", "registration-success": "Registration Success", - "join-a-group": "Join a Group", - "create-a-new-group": "Create a New Group", + "join-a-group": "加入群组", + "create-a-new-group": "创建新群组", "provide-registration-token-description": "Please provide the registration token associated with the group that you'd like to join. You'll need to obtain this from an existing group member.", - "group-details": "Group Details", - "group-details-description": "Before you create an account you'll need to create a group. Your group will only contain you, but you'll be able to invite others later. Members in your group can share meal plans, shopping lists, recipes, and more!", + "group-details": "群组详情", + "group-details-description": "在你创建帐户之前,需要先创建一个群组。此时群组将只包含你自己,但稍后你便可邀请其他人。 你的群组成员可以分享食谱、用餐计划、购物清单等!", "use-seed-data": "Use Seed Data", "use-seed-data-description": "Mealie附带一套现成的“食品”、“单位”、“标签”数据,可以帮助你的群组管理食谱。", "account-details": "Account Details" }, "validation": { - "group-name-is-taken": "Group name is taken", + "group-name-is-taken": "群组名称已被占用", "username-is-taken": "Username is taken", "email-is-taken": "Email is taken", "this-field-is-required": "This Field is Required" @@ -1128,8 +1128,8 @@ "get-public-link": "Get Public Link", "account-summary": "Account Summary", "account-summary-description": "Here's a summary of your group's information", - "group-statistics": "Group Statistics", - "group-statistics-description": "Your Group Statistics provide some insight how you're using Mealie.", + "group-statistics": "群组统计", + "group-statistics-description": "群组统计为你如何使用Mealie提供一些深入信息。", "storage-capacity": "总储存容量", "storage-capacity-description": "Your storage capacity is a calculation of the images and assets you have uploaded.", "personal": "Personal", From 88aa8b2edb6375ede58e5a17b3dc2e8a114c3570 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Fri, 22 Dec 2023 05:20:58 -0600 Subject: [PATCH 17/68] New translations en-us.json (Chinese Simplified) --- frontend/lang/messages/zh-CN.json | 120 +++++++++++++++--------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/frontend/lang/messages/zh-CN.json b/frontend/lang/messages/zh-CN.json index fa435e09f130..3717d1c61df2 100644 --- a/frontend/lang/messages/zh-CN.json +++ b/frontend/lang/messages/zh-CN.json @@ -37,17 +37,17 @@ }, "category": { "categories": "分类", - "category-created": "类别已创建", - "category-creation-failed": "创建类别失败", - "category-deleted": "类别已删除", - "category-deletion-failed": "删除类别失败", - "category-filter": "类别筛选", - "category-update-failed": "更新类别失败", - "category-updated": "类别已更新", + "category-created": "已创建分类", + "category-creation-failed": "创建分类失败", + "category-deleted": "已删除分类", + "category-deletion-failed": "删除分类失败", + "category-filter": "分类过滤器", + "category-update-failed": "更新分类失败", + "category-updated": "已更新分类", "uncategorized-count": "未分类 {count}", "create-a-category": "创建分类", - "category-name": "类别名称", - "category": "类别" + "category-name": "分类名称", + "category": "分类" }, "events": { "apprise-url": "Apprise URL", @@ -70,12 +70,12 @@ "enable-notifier": "打开消息通知", "what-events": "该通知器需要订阅哪些事件?", "user-events": "用户事件", - "mealplan-events": "用餐计划事件", - "when-a-user-in-your-group-creates-a-new-mealplan": "当你群组中的用户创建新用餐计划时", + "mealplan-events": "饮食计划事件", + "when-a-user-in-your-group-creates-a-new-mealplan": "当你群组中的用户创建新饮食计划时", "shopping-list-events": "购物清单事件", "cookbook-events": "食谱合集事件", "tag-events": "标签事件", - "category-events": "目录事件", + "category-events": "分类事件", "when-a-new-user-joins-your-group": "当新用户加入您的群组时", "recipe-events": "食谱事件" }, @@ -128,7 +128,7 @@ "no-recipe-found": "未找到食谱", "ok": "好的", "options": "选项:", - "plural-name": "Plural Name", + "plural-name": "复数名称", "print": "打印", "print-preferences": "打印偏好设置", "random": "随机", @@ -180,7 +180,7 @@ "delete-with-name": "删除{name}", "confirm-delete-generic-with-name": "确定要删除{name} 么?", "confirm-delete-own-admin-account": "请注意,您正在试图删除您的管理员帐户!此操作不能撤销并且您的账户将被永久删除", - "organizer": "管理员", + "organizer": "组织者", "transfer": "转移", "copy": "复制", "color": "颜色", @@ -249,38 +249,38 @@ "general-preferences": "通用设置", "group-recipe-preferences": "群组食谱偏好设置", "report": "报告", - "report-with-id": "Report ID: {id}", + "report-with-id": "报告ID: {id}", "group-management": "群组管理", "admin-group-management": "管理员组管理", "admin-group-management-text": "对本群组的更改将被立即应用。", "group-id-value": "群组ID:{0}" }, "meal-plan": { - "create-a-new-meal-plan": "创建一个新的用餐计划", + "create-a-new-meal-plan": "新建饮食计划", "dinner-this-week": "本周晚餐", "dinner-today": "今日晚餐", "dinner-tonight": "今晚食谱", - "edit-meal-plan": "编辑用餐计划", + "edit-meal-plan": "编辑饮食计划", "end-date": "结束日期", "group": "群组 (Beta)", "main": "主要内容", - "meal-planner": "用餐计划", - "meal-plans": "用餐计划", - "mealplan-categories": "食谱计划分类", - "mealplan-created": "膳食计划已创建", - "mealplan-creation-failed": "膳食计划创建失败", - "mealplan-deleted": "膳食计划已删除", - "mealplan-deletion-failed": "食谱计划删除失败", - "mealplan-settings": "食谱计划设置", - "mealplan-update-failed": "食谱更新失败", - "mealplan-updated": "食谱计划已更新", - "no-meal-plan-defined-yet": "还没有定义食谱计划", - "no-meal-planned-for-today": "今日没有排定的食谱计划", - "only-recipes-with-these-categories-will-be-used-in-meal-plans": "只有与这些类别相关的食谱才会被用于用餐计划", - "planner": "策划人", + "meal-planner": "饮食计划", + "meal-plans": "饮食计划", + "mealplan-categories": "饮食计划分类", + "mealplan-created": "已创建饮食计划", + "mealplan-creation-failed": "创建饮食计划失败", + "mealplan-deleted": "已删除饮食计划", + "mealplan-deletion-failed": "删除饮食计划失败", + "mealplan-settings": "饮食计划设置", + "mealplan-update-failed": "更新饮食计划失败", + "mealplan-updated": "已更新饮食计划", + "no-meal-plan-defined-yet": "还没有制定饮食计划", + "no-meal-planned-for-today": "今日没有饮食计划", + "only-recipes-with-these-categories-will-be-used-in-meal-plans": "只有属于这些分类的食谱才会被用于饮食计划", + "planner": "计划人", "quick-week": "快速创建周食谱计划", - "side": "侧栏", - "sides": "侧栏", + "side": "零食", + "sides": "零食", "start-date": "开始日期", "rule-day": "用餐时间", "meal-type": "用餐时段", @@ -290,18 +290,18 @@ "type-any": "任意", "day-any": "任意", "editor": "编辑器", - "meal-recipe": "食物配方", - "meal-title": "食物名称", - "meal-note": "食物笔记", + "meal-recipe": "用餐食谱", + "meal-title": "用餐标题", + "meal-note": "用餐笔记", "note-only": "仅备注", "random-meal": "随机用餐", "random-dinner": "随即晚餐", - "random-side": "随即配菜", + "random-side": "随机零食", "this-rule-will-apply": "此规则将应用于{dayCriteria}{mealTypeCriteria}。", "to-all-days": "所有天", "on-days": "在{0}", "for-all-meal-types": "所有用餐时段", - "for-type-meal-types": "{0}用餐时段", + "for-type-meal-types": "作为 {0}", "meal-plan-rules": "饮食计划规则", "new-rule": "新建规则", "meal-plan-rules-description": "您可以创建规则,为您的饮食计划自动选择食谱。当新建饮食计划时,这些规则被服务器用来确定菜谱随机选择的范围。请注意,如果规则中含有相同的日期/类型的限制,那么将合并规则的分类。实际上,没有必要创建重复的规则,但是可以这样做。", @@ -403,7 +403,7 @@ "calories": "卡路里", "calories-suffix": "卡路里", "carbohydrate-content": "碳水化合物", - "categories": "分类目录", + "categories": "分类", "comment-action": "评论", "comment": "评论", "comments": "评论", @@ -430,8 +430,8 @@ "no-white-space-allowed": "不允许有空格", "note": "备注", "nutrition": "营养", - "object-key": "Object Key", - "object-value": "Object Value", + "object-key": "对象键", + "object-value": "对象值", "original-url": "原食谱链接", "perform-time": "烹饪时间", "prep-time": "准备时间", @@ -462,7 +462,7 @@ "no-recipe": "没有食谱", "locked-by-owner": "已被所有者锁定", "join-the-conversation": "Join the Conversation", - "add-recipe-to-mealplan": "把该食谱添加到用餐计划", + "add-recipe-to-mealplan": "把该食谱添加到饮食计划", "entry-type": "条目类型", "date-format-hint": "MM/DD/YYYY 格式", "date-format-hint-yyyy-mm-dd": "YYYY-MM-DD 格式", @@ -471,9 +471,9 @@ "add-to-timeline": "添加到时间线", "recipe-added-to-list": "食谱已被添加到购物清单", "recipes-added-to-list": "食谱已被添加到购物清单", - "recipe-added-to-mealplan": "食谱已被添加到用餐计划", + "recipe-added-to-mealplan": "已添加该食谱到饮食计划", "failed-to-add-recipes-to-list": "食谱未能添加到购物清单", - "failed-to-add-recipe-to-mealplan": "食谱未能添加到用餐计划", + "failed-to-add-recipe-to-mealplan": "添加食谱到饮食计划失败", "yield": "Yield", "quantity": "数量", "choose-unit": "选择单位", @@ -510,13 +510,13 @@ "how-did-it-turn-out": "成品怎么样?", "user-made-this": "由 {user} 制作", "last-made-date": "上次制作于{date}", - "api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.", + "api-extras-description": "食谱扩展是Mealie API的关键功能之一。它允许你在食谱中添加自定义JSON键值对,以供第三方程序使用。你可以利用这些键提供信息,实现更多功能,例如触发自动化,或转发自定义信息到指定的设备上。", "message-key": "键名", "parse": "自动解析", "attach-images-hint": "如需添加图片,可将其拖拽到编辑器", - "drop-image": "Drop image", + "drop-image": "拖放图片", "enable-ingredient-amounts-to-use-this-feature": "使用此项功能需启用食材用量", - "recipes-with-units-or-foods-defined-cannot-be-parsed": "Recipes with units or foods defined cannot be parsed.", + "recipes-with-units-or-foods-defined-cannot-be-parsed": "无法解析定义了单位或食物的食谱", "parse-ingredients": "自动解析食材", "edit-markdown": "编辑Markdown", "recipe-creation": "创建食谱", @@ -678,7 +678,7 @@ }, "webhooks": { "test-webhooks": "测试Webhooks", - "the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "下方列出的网址将在预定日期接收到有关用餐计划的食谱资料。Webhooks执行将在", + "the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "下列URL将会在预定日期收到当日饮食计划包含的食谱数据。当前webhooks将于执行于:", "webhook-url": "Webhook网址", "webhooks-caps": "WEBHOOKS", "webhooks": "Webhooks", @@ -729,7 +729,7 @@ "shopping-lists": "购物清单", "food": "食物", "note": "备注", - "label": "标签", + "label": "标注", "linked-item-warning": "This item is linked to one or more recipe. Adjusting the units or foods will yield unexpected results when adding or removing the recipe from this list.", "toggle-food": "Toggle Food", "manage-labels": "管理标签", @@ -836,7 +836,7 @@ "register": "Register", "reset-password": "重置密码", "sign-in": "登入", - "total-mealplans": "总用餐计划", + "total-mealplans": "总饮食计划", "total-users": "用户总数", "upload-photo": "上传照片", "use-8-characters-or-more-for-your-password": "请设置密码字符为8个或更多", @@ -996,9 +996,9 @@ "registration-success": "Registration Success", "join-a-group": "加入群组", "create-a-new-group": "创建新群组", - "provide-registration-token-description": "Please provide the registration token associated with the group that you'd like to join. You'll need to obtain this from an existing group member.", + "provide-registration-token-description": "请提供你想要加入的群组的注册令牌。你需要从现有的群组成员那里获得令牌。", "group-details": "群组详情", - "group-details-description": "在你创建帐户之前,需要先创建一个群组。此时群组将只包含你自己,但稍后你便可邀请其他人。 你的群组成员可以分享食谱、用餐计划、购物清单等!", + "group-details-description": "在你创建账户之前,需要先创建一个群组。此时群组将只包含你自己,但稍后你便可邀请其他人。 你的群组成员可以分享食谱、饮食计划、购物清单等!", "use-seed-data": "Use Seed Data", "use-seed-data-description": "Mealie附带一套现成的“食品”、“单位”、“标签”数据,可以帮助你的群组管理食谱。", "account-details": "Account Details" @@ -1107,7 +1107,7 @@ "actions-title": "Actions" }, "ingredients-natural-language-processor": "食材条目自然语言处理器", - "ingredients-natural-language-processor-explanation": "Mealie uses Conditional Random Fields (CRFs) for parsing and processing ingredients. The model used for ingredients is based off a data set of over 100,000 ingredients from a dataset compiled by the New York Times. Note that as the model is trained in English only, you may have varied results when using the model in other languages. This page is a playground for testing the model.", + "ingredients-natural-language-processor-explanation": "Mealie用条件随机场(CRFs) 算法解析食材。模型的数据集则基于纽约时报编写的一个包含十万多种食材的数据库。注意该模型仅采用英文数据训练,因此用于其他语言时未必有好的效果。本页面用于测试模型效果。", "ingredients-natural-language-processor-explanation-2": "It's not perfect, but it yields great results in general and is a good starting point for manually parsing ingredients into individual fields. Alternatively, you can also use the \"Brute\" processor that uses a pattern matching technique to identify ingredients.", "nlp": "NLP", "brute": "Brute", @@ -1123,11 +1123,11 @@ }, "profile": { "welcome-user": "👋 Welcome, {0}", - "description": "Manage your profile, recipes, and group settings.", + "description": "管理您的个人资料、菜谱和群组设置。", "get-invite-link": "Get Invite Link", "get-public-link": "Get Public Link", "account-summary": "Account Summary", - "account-summary-description": "Here's a summary of your group's information", + "account-summary-description": "这是您的群组信息的摘要", "group-statistics": "群组统计", "group-statistics-description": "群组统计为你如何使用Mealie提供一些深入信息。", "storage-capacity": "总储存容量", @@ -1137,13 +1137,13 @@ "user-settings": "User Settings", "user-settings-description": "管理偏好,修改密码,更换邮箱地址", "api-tokens-description": "Manage your API Tokens for access from external applications", - "group-description": "These items are shared within your group. Editing one of them will change it for the whole group!", - "group-settings": "Group Settings", - "group-settings-description": "Manage your common group settings like mealplan and privacy settings.", + "group-description": "这些项目已在你的群组中共享,一旦被编辑,更改之处会对所有群组成员生效!", + "group-settings": "群组设置", + "group-settings-description": "管理常见的群组设置,如饮食计划和隐私设置。", "cookbooks-description": "Manage a collection of recipe categories and generate pages for them.", "members": "成员", - "members-description": "See who's in your group and manage their permissions.", - "webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.", + "members-description": "查看哪些人在你的群组中,并管理他们的权限。", + "webhooks-description": "配置在你某天有饮食计划时,当日触发的webhooks。", "notifiers": "Notifiers", "notifiers-description": "设置邮件、基于特定事件推送通知", "manage-data": "Manage Data", From 331bff84c33d10ef9965eedde2e20ebda7337368 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Fri, 22 Dec 2023 05:21:00 -0600 Subject: [PATCH 18/68] New translations en-us.json (Swedish) --- frontend/lang/messages/sv-SE.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/lang/messages/sv-SE.json b/frontend/lang/messages/sv-SE.json index 8233d70e91b5..f6900b239a02 100644 --- a/frontend/lang/messages/sv-SE.json +++ b/frontend/lang/messages/sv-SE.json @@ -249,7 +249,7 @@ "general-preferences": "Generella inställningar", "group-recipe-preferences": "Inställningar för receptgrupper", "report": "Rapport", - "report-with-id": "Report ID: {id}", + "report-with-id": "RapportID: {id}", "group-management": "Grupphantering", "admin-group-management": "Hantering av administratörsgrupp", "admin-group-management-text": "Ändringar i denna grupp kommer att återspeglas omedelbart.", @@ -355,7 +355,7 @@ "paprika-text": "Mealie kan importera recept från Paprika-applikationen. Exportera dina recept från Paprika, byt namn på filnamnstillägget på exporten till .zip och ladda upp det nedan.", "mealie-text": "Mealie kan importera recept från Mealieapplikationen från en före v1.0 version. Exportera dina recept från din gamla instans, och ladda upp zip-filen nedan. Observera att endast recept kan importeras från exporten.", "plantoeat": { - "title": "Plan to Eat", + "title": "Planera att äta", "description-long": "Mealie kan importera recept från Plan to Eat." } }, From 408718558be949960b7978dcf2a283703d66377d Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Sun, 24 Dec 2023 12:42:11 -0600 Subject: [PATCH 19/68] New Crowdin updates (#2876) * New translations en-us.json (Italian) * New translations en-us.json (Swedish) * New translations en-us.json (Chinese Simplified) --- frontend/lang/messages/it-IT.json | 46 ++--- frontend/lang/messages/sv-SE.json | 10 +- frontend/lang/messages/zh-CN.json | 272 +++++++++++++++--------------- 3 files changed, 164 insertions(+), 164 deletions(-) diff --git a/frontend/lang/messages/it-IT.json b/frontend/lang/messages/it-IT.json index 08f8232331a7..2c3bbe3884ba 100644 --- a/frontend/lang/messages/it-IT.json +++ b/frontend/lang/messages/it-IT.json @@ -114,10 +114,10 @@ "json": "JSON", "keyword": "Parola chiave", "link-copied": "Link Copiato", - "loading": "Loading", + "loading": "Caricamento in corso", "loading-events": "Caricamento eventi", - "loading-recipe": "Loading recipe...", - "loading-ocr-data": "Loading OCR data...", + "loading-recipe": "Caricamento della ricetta...", + "loading-ocr-data": "Caricamento dati OCR...", "loading-recipes": "Caricamento Ricette", "message": "Messaggio", "monday": "Lunedì", @@ -128,7 +128,7 @@ "no-recipe-found": "Nessuna Ricetta Trovata", "ok": "OK", "options": "Opzioni:", - "plural-name": "Plural Name", + "plural-name": "Nome Plurale", "print": "Stampa", "print-preferences": "Preferenze Di Stampa", "random": "Casuale", @@ -496,10 +496,10 @@ "public-link": "Link Pubblico", "timer": { "kitchen-timer": "Kitchen Timer", - "start-timer": "Start Timer", + "start-timer": "Avvia timer", "pause-timer": "Pause Timer", "resume-timer": "Resume Timer", - "stop-timer": "Stop Timer" + "stop-timer": "Arresta il Timer" }, "edit-timeline-event": "Modifica Evento Timeline", "timeline": "Timeline", @@ -554,7 +554,7 @@ "unit": "Unità", "upload-image": "Carica immagine", "screen-awake": "Keep Screen Awake", - "remove-image": "Remove image" + "remove-image": "Rimuovi immagine" }, "search": { "advanced-search": "Ricerca Avanzata", @@ -573,16 +573,16 @@ "search-hint": "Premi '/'", "advanced": "Ricerca Avanzata", "auto-search": "Ricerca automatica", - "no-results": "No results found" + "no-results": "Nessun risultato trovato" }, "settings": { "add-a-new-theme": "Aggiungi un Nuovo Tema", "admin-settings": "Impostazioni Amministratore", "backup": { - "backup-created": "Backup created successfully", + "backup-created": "Backup creato con successo", "backup-created-at-response-export_path": "Backup Creato in {path}", "backup-deleted": "Backup eliminato", - "restore-success": "Restore successful", + "restore-success": "Ripristino riuscito", "backup-tag": "Tag Backup", "create-heading": "Crea un Backup", "delete-backup": "Elimina Backup", @@ -696,7 +696,7 @@ "status-unknown-try-running-a-validation": "Stato sconosciuto. Prova ad eseguire una convalida.", "validate": "Convalida", "email-configuration-status": "Configurazione e-mail", - "email-configured": "Email Configured", + "email-configured": "Email configurata", "email-test-results": "Email Test Results", "ready": "Pronto", "not-ready": "Non Pronto - Verifica Variabili Di Ambiente", @@ -853,7 +853,7 @@ "username": "Nome Utente", "users-header": "UTENTI", "users": "Utenti", - "user-not-found": "User not found", + "user-not-found": "Utente non trovato", "webhook-time": "Ora Webhook", "webhooks-enabled": "Webhooks Abilitati", "you-are-not-allowed-to-create-a-user": "Non sei autorizzato per la creazione di utenti", @@ -889,7 +889,7 @@ "enable-advanced-features": "Abilita funzionalità avanzate", "it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.", "dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!", - "forgot-password": "Forgot Password", + "forgot-password": "Password Dimenticata", "forgot-password-text": "Please enter your email address and we will send you a link to reset your password.", "changes-reflected-immediately": "Changes to this user will be reflected immediately." }, @@ -965,8 +965,8 @@ "delete-recipes": "Elimina Ricette", "source-unit-will-be-deleted": "L'unità di origine verrà eliminata" }, - "create-alias": "Create Alias", - "manage-aliases": "Manage Aliases", + "create-alias": "Crea Alias", + "manage-aliases": "Gestisci Alias", "seed-data": "Dati Predefiniti", "seed": "Inizializza", "data-management": "Gestione Dati", @@ -976,8 +976,8 @@ "columns": "Colonne", "combine": "Unisci", "categories": { - "edit-category": "Edit Category", - "new-category": "New Category", + "edit-category": "Modifica categoria", + "new-category": "Nuova categoria", "category-data": "Category Data" }, "tags": { @@ -1157,13 +1157,13 @@ "show-advanced-description": "Mostra funzionalità avanzate (Chiavi API, Webhook e Gestione dati)", "back-to-profile": "Torna al Profilo", "looking-for-privacy-settings": "Stai cercando le Impostazioni Della Privacy?", - "manage-your-api-tokens": "Manage Your API Tokens", - "manage-user-profile": "Manage User Profile", - "manage-cookbooks": "Manage Cookbooks", - "manage-members": "Manage Members", + "manage-your-api-tokens": "Gestisci i tuoi Token Api", + "manage-user-profile": "Gestisci Profilo Utente", + "manage-cookbooks": "Gestisci Libri Di Cucina", + "manage-members": "Gestisci i membri", "manage-webhooks": "Manage Webhooks", - "manage-notifiers": "Manage Notifiers", - "manage-data-migrations": "Manage Data Migrations" + "manage-notifiers": "Gestisci Notifiche", + "manage-data-migrations": "Gestione Migrazioni Dei Dati" }, "cookbook": { "cookbooks": "Ricettari", diff --git a/frontend/lang/messages/sv-SE.json b/frontend/lang/messages/sv-SE.json index f6900b239a02..1e31ce19a560 100644 --- a/frontend/lang/messages/sv-SE.json +++ b/frontend/lang/messages/sv-SE.json @@ -510,7 +510,7 @@ "how-did-it-turn-out": "Hur blev rätten?", "user-made-this": "{user} lagade detta", "last-made-date": "Senast lagad {date}", - "api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.", + "api-extras-description": "Recept extras är en viktig funktion i Mealie's API. Med hjälp av dem kan du skapa anpassade JSON-nyckel/värdepar i ett recept, som du kan referera till från tredjepartsapplikationer. Du kan använda dessa nycklar för att tillhandahålla information, till exempel för att trigga automatiseringar eller anpassade meddelanden som ska vidarebefordras till önskad enhet.", "message-key": "Meddelandenyckel", "parse": "Läs in", "attach-images-hint": "Bifoga bilder genom att dra och släppa dem i redigeraren", @@ -596,7 +596,7 @@ "back-restore-description": "Återställning av den här backuppen kommer att skriva över all information i databasen och datakatalogen och ersätta allt med innehållet i nackuppen. {cannot-be-undone} Om återställningen går bra kommer du att loggas ut.", "cannot-be-undone": "Denna åtgärd kan inte ångras - använd med försiktighet.", "postgresql-note": "Om du använder PostGreSQL, vänligen granska {backup-restore-process} innan du återställer.", - "backup-restore-process-in-the-documentation": "backup/restore process in the documentation", + "backup-restore-process-in-the-documentation": "säkerhetskopiering/återställning i dokumentationen", "irreversible-acknowledgment": "Jag förstår att denna åtgärd är oåterkallelig, destruktiv och kan orsaka dataförlust", "restore-backup": "Återställ säkerhetskopia" }, @@ -683,10 +683,10 @@ "webhooks-caps": "WEBHOOKS", "webhooks": "Webhooks", "webhook-name": "Namn på webhook", - "description": "The webhooks defined below will be executed when a meal is defined for the day. At the scheduled time the webhooks will be sent with the data from the recipe that is scheduled for the day. Note that webhook execution is not exact. The webhooks are executed on a 5 minutes interval so the webhooks will be executed within 5 +/- minutes of the scheduled." + "description": "De webhooks som definieras nedan kommer att exekveras när en måltid definieras för dagen. Vid den schemalagda tiden skickas webhooks med data från receptet som är schemalagt för dagen. Observera att exekveringen av webhooks inte är exakt. Webhooks exekveras med ett 5 minuters intervall så att webhooks kommer att exekveras inom 5 +/- minuter från den schemalagda tiden." }, "bug-report": "Buggrapport", - "bug-report-information": "Use this information to report a bug. Providing details of your instance to developers is the best way to get your issues resolved quickly.", + "bug-report-information": "Använd denna information för att rapportera ett fel. Att ge utvecklarna information om din installation är det bästa sättet att få dina problem lösta snabbt.", "tracker": "Spårare", "configuration": "Konfiguration", "docker-volume": "Docker volym", @@ -697,7 +697,7 @@ "validate": "Validera", "email-configuration-status": "Email Configuration Status", "email-configured": "Email Configured", - "email-test-results": "Email Test Results", + "email-test-results": "Testresultat för e-post", "ready": "Redo", "not-ready": "Inte redo - Kontrollera miljövariabler", "succeeded": "Lyckades", diff --git a/frontend/lang/messages/zh-CN.json b/frontend/lang/messages/zh-CN.json index 3717d1c61df2..f1429f1288f0 100644 --- a/frontend/lang/messages/zh-CN.json +++ b/frontend/lang/messages/zh-CN.json @@ -164,7 +164,7 @@ "view": "查看", "wednesday": "周三", "yes": "是", - "foods": "食物", + "foods": "食品", "units": "单位", "back": "返回", "next": "下一步", @@ -461,7 +461,7 @@ "unable-to-delete-recipe": "无法删除食谱", "no-recipe": "没有食谱", "locked-by-owner": "已被所有者锁定", - "join-the-conversation": "Join the Conversation", + "join-the-conversation": "一起聊聊吧", "add-recipe-to-mealplan": "把该食谱添加到饮食计划", "entry-type": "条目类型", "date-format-hint": "MM/DD/YYYY 格式", @@ -478,7 +478,7 @@ "quantity": "数量", "choose-unit": "选择单位", "press-enter-to-create": "按回车键以创建", - "choose-food": "选择食物", + "choose-food": "选择食品", "notes": "备注", "toggle-section": "切换分类", "see-original-text": "查看原文", @@ -516,7 +516,7 @@ "attach-images-hint": "如需添加图片,可将其拖拽到编辑器", "drop-image": "拖放图片", "enable-ingredient-amounts-to-use-this-feature": "使用此项功能需启用食材用量", - "recipes-with-units-or-foods-defined-cannot-be-parsed": "无法解析定义了单位或食物的食谱", + "recipes-with-units-or-foods-defined-cannot-be-parsed": "无法解析定义了单位或食品的食谱", "parse-ingredients": "自动解析食材", "edit-markdown": "编辑Markdown", "recipe-creation": "创建食谱", @@ -573,16 +573,16 @@ "search-hint": "按 '/'", "advanced": "高级", "auto-search": "自动搜索", - "no-results": "No results found" + "no-results": "未找到任何结果" }, "settings": { "add-a-new-theme": "新增布景主题", "admin-settings": "管理设置", "backup": { - "backup-created": "Backup created successfully", + "backup-created": "创建备份成功", "backup-created-at-response-export_path": "备份创建于 {path}", "backup-deleted": "备份已删除", - "restore-success": "Restore successful", + "restore-success": "还原成功", "backup-tag": "标签备份", "create-heading": "创建备份", "delete-backup": "删除备份", @@ -687,34 +687,34 @@ }, "bug-report": "漏洞报告", "bug-report-information": "Use this information to report a bug. Providing details of your instance to developers is the best way to get your issues resolved quickly.", - "tracker": "Tracker", - "configuration": "Configuration", + "tracker": "报告问题", + "configuration": "配置", "docker-volume": "Docker目录", "docker-volume-help": "Mealie requires that the frontend container and the backend share the same docker volume or storage. This ensures that the frontend container can properly access the images and assets stored on disk.", "volumes-are-misconfigured": "Volumes are misconfigured.", "volumes-are-configured-correctly": "Volumes are configured correctly.", "status-unknown-try-running-a-validation": "Status Unknown. Try running a validation.", "validate": "验证", - "email-configuration-status": "Email Configuration Status", - "email-configured": "Email Configured", - "email-test-results": "Email Test Results", - "ready": "Ready", - "not-ready": "Not Ready - Check Environmental Variables", + "email-configuration-status": "电子邮件配置状态", + "email-configured": "已配置电子邮件", + "email-test-results": "电子邮件测试结果", + "ready": "已就绪", + "not-ready": "尚未就绪,请检查环境变量", "succeeded": "成功", "failed": "失败", "general-about": "关于", "application-version": "软件版本", - "application-version-error-text": "Your current version ({0}) does not match the latest release. Considering updating to the latest version ({1}).", + "application-version-error-text": "您当前的版本 ({0}) 与最新版本不匹配。请考虑更新到最新版本 ({1})。", "mealie-is-up-to-date": "Mealie 是最新版", "secure-site": "安全站点", "secure-site-error-text": "运行于本机或受https保护,剪切板和一些浏览器API可能无法正常工作。", "secure-site-success-text": "本站点经由本机或https协议访问", - "server-side-base-url": "Server Side Base URL", - "server-side-base-url-error-text": "`BASE_URL` is still the default value on API Server. This will cause issues with notifications links generated on the server for emails, etc.", - "server-side-base-url-success-text": "Server Side URL does not match the default", + "server-side-base-url": "服务器端根URL", + "server-side-base-url-error-text": "环境变量“BASE_URL“仍是API服务器上的默认值。这可能造成服务器自动发送的邮件内所包含的通知链接不可用等问题。", + "server-side-base-url-success-text": "已配置服务器端URL", "ldap-ready": "LDAP 已就绪", - "ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.", - "ldap-ready-success-text": "Required LDAP variables are all set.", + "ldap-ready-error-text": "某些LDAP环境变量尚未配置。(如果你不使用LDAP验证可以忽略该报错)", + "ldap-ready-success-text": "LDAP所需的环境变量均已配置。", "build": "生成", "recipe-scraper-version": "Recipe Scraper Version" }, @@ -727,11 +727,11 @@ "quantity": "数量: {0} 个", "shopping-list": "购物清单", "shopping-lists": "购物清单", - "food": "食物", + "food": "食品", "note": "备注", "label": "标注", - "linked-item-warning": "This item is linked to one or more recipe. Adjusting the units or foods will yield unexpected results when adding or removing the recipe from this list.", - "toggle-food": "Toggle Food", + "linked-item-warning": "此条目已经与一个或多个食谱有关。若强行变更它的单位或食品,会在增减下方关联食谱份数时产生意外结果。", + "toggle-food": "是否为数据库中的食品", "manage-labels": "管理标签", "are-you-sure-you-want-to-delete-this-item": "你确定要删除该条目吗?", "copy-as-text": "复制文本", @@ -787,17 +787,17 @@ "tag-updated": "标签已更新", "tags": "标签", "untagged-count": "无标签的共 {count} 个", - "create-a-tag": "Create a Tag", + "create-a-tag": "创建标签", "tag-name": "标签名称" }, "tool": { - "tools": "工具", - "on-hand": "On Hand", - "create-a-tool": "创建新工具", - "tool-name": "工具名称", - "create-new-tool": "Create New Tool", + "tools": "用具", + "on-hand": "已拥有", + "create-a-tool": "创建新用具", + "tool-name": "用具名称", + "create-new-tool": "新建用具", "on-hand-checkbox-label": "Show as On Hand (Checked)", - "required-tools": "所需工具" + "required-tools": "所需用具" }, "user": { "admin": "管理员", @@ -817,7 +817,7 @@ "error-cannot-delete-super-user": "错误!无法删除超级用户", "existing-password-does-not-match": "与现有的密码不匹配", "full-name": "全名", - "generate-password-reset-link": "Generate Password Reset Link", + "generate-password-reset-link": "生成重置密码链接", "invite-only": "Invite Only", "link-id": "链接ID", "link-name": "链接名", @@ -868,29 +868,29 @@ "account-locked-please-try-again-later": "Account Locked. Please try again later", "user-favorites": "User Favorites", "password-strength-values": { - "weak": "Weak", - "good": "Good", - "strong": "Strong", - "very-strong": "Very Strong" + "weak": "脆弱", + "good": "中等", + "strong": "优秀", + "very-strong": "超强" }, - "user-management": "User Management", - "reset-locked-users": "Reset Locked Users", - "admin-user-creation": "Admin User Creation", - "admin-user-management": "Admin User Management", - "user-details": "User Details", - "user-name": "User Name", - "authentication-method": "Authentication Method", + "user-management": "多用户管理", + "reset-locked-users": "解锁被锁定用户", + "admin-user-creation": "管理员手动创建用户", + "admin-user-management": "管理员手动管理用户", + "user-details": "用户详情", + "user-name": "用户名", + "authentication-method": "验证方式", "authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie", "permissions": "权限", "administrator": "管理员", "user-can-invite-other-to-group": "用户可以邀请其他人加入群组", "user-can-manage-group": "用户可以管理群组", "user-can-organize-group-data": "用户可以整理群组数据", - "enable-advanced-features": "Enable advanced features", - "it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.", - "dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!", - "forgot-password": "Forgot Password", - "forgot-password-text": "Please enter your email address and we will send you a link to reset your password.", + "enable-advanced-features": "启用高级功能", + "it-looks-like-this-is-your-first-time-logging-in": "看起来这是你第一次登录。", + "dont-want-to-see-this-anymore-be-sure-to-change-your-email": "不想再看到这条消息了吗?请务必在你的用户设置中更改电子邮件!", + "forgot-password": "忘记密码", + "forgot-password-text": "请输入你的电邮地址,我们会发给你重置密码的链接。", "changes-reflected-immediately": "Changes to this user will be reflected immediately." }, "language-dialog": { @@ -902,111 +902,111 @@ }, "data-pages": { "foods": { - "merge-dialog-text": "Combining the selected foods will merge the source food and target food into a single food. The source food will be deleted and all of the references to the source food will be updated to point to the target food.", + "merge-dialog-text": "此操作将把“待合并食物”和“目标食物”合并为一个食物(即“目标食物”)。 “待合并食物”将会被删除 ,之前所有对“待合并食物”的引用都会指向“目标食物”。", "merge-food-example": "Merging {food1} into {food2}", - "seed-dialog-text": "Seed the database with foods based on your local language. This will create 200+ common foods that can be used to organize your database. Foods are translated via a community effort.", - "seed-dialog-warning": "You have already have some items in your database. This action will not reconcile duplicates, you will have to manage them manually.", - "combine-food": "Combine Food", - "source-food": "Source Food", - "target-food": "Target Food", - "create-food": "Create Food", - "food-label": "Food Label", - "edit-food": "Edit Food", - "food-data": "Food Data", - "example-food-singular": "ex: Onion", - "example-food-plural": "ex: Onions" + "seed-dialog-text": "基于你的本地语言,将一些常见食物添加到数据库。(会有200多种常见食物被添加到你的数据库。食物名称由开源社区志愿者翻译。)", + "seed-dialog-warning": "你的数据库中已经存在一些数据。此操作不会处理一些可能存在重复的条目,你需要手动管理它们。", + "combine-food": "合并食品", + "source-food": "待合并食物", + "target-food": "目标食物", + "create-food": "创建食品", + "food-label": "食品标注", + "edit-food": "编辑食品", + "food-data": "食品数据", + "example-food-singular": "例如:洋葱", + "example-food-plural": "中文用户可忽略" }, "units": { - "seed-dialog-text": "Seed the database with common units based on your local language.", - "combine-unit-description": "Combining the selected units will merge the Source Unit and Target Unit into a single unit. The {source-unit-will-be-deleted} and all of the references to the Source Unit will be updated to point to the Target Unit.", - "combine-unit": "Combine Unit", - "source-unit": "Source Unit", - "target-unit": "Target Unit", - "merging-unit-into-unit": "Merging {0} into {1}", - "create-unit": "Create Unit", - "abbreviation": "Abbreviation", - "plural-abbreviation": "Plural Abbreviation", - "description": "Description", - "display-as-fraction": "Display as Fraction", - "use-abbreviation": "Use Abbreviation", - "edit-unit": "Edit Unit", - "unit-data": "Unit Data", - "use-abbv": "Use Abbv.", - "fraction": "Fraction", - "example-unit-singular": "ex: Tablespoon", - "example-unit-plural": "ex: Tablespoons", - "example-unit-abbreviation-singular": "ex: Tbsp", - "example-unit-abbreviation-plural": "ex: Tbsps" + "seed-dialog-text": "基于你的本地语言,将一些常见单位添加到数据库。", + "combine-unit-description": "此操作将把“待合并单位”和“目标单位”合并为一个单位(即“目标单位”)。 {source-unit-will-be-deleted} ,之前所有对“待合并单位”的引用都会指向“目标单位”。", + "combine-unit": "合并单位", + "source-unit": "待合并单位", + "target-unit": "目标单位", + "merging-unit-into-unit": "正在将 {0} 合并到 {1}", + "create-unit": "创建单位", + "abbreviation": "缩写", + "plural-abbreviation": "复数缩写", + "description": "说明", + "display-as-fraction": "小数位以分数形式展示", + "use-abbreviation": "使用缩写", + "edit-unit": "编辑单位", + "unit-data": "单位数据", + "use-abbv": "使用缩写", + "fraction": "分数", + "example-unit-singular": "例如:茶匙", + "example-unit-plural": "中文用户可忽略", + "example-unit-abbreviation-singular": "例如:勺", + "example-unit-abbreviation-plural": "中文用户可忽略" }, "labels": { - "seed-dialog-text": "Seed the database with common labels based on your local language.", - "edit-label": "Edit Label", - "new-label": "New Label", - "labels": "Labels" + "seed-dialog-text": "基于你的本地语言,将一些常见标注添加到数据库。", + "edit-label": "编辑标注", + "new-label": "新标注", + "labels": "标注" }, "recipes": { "purge-exports": "Purge Exports", "are-you-sure-you-want-to-delete-all-export-data": "Are you sure you want to delete all export data?", - "confirm-delete-recipes": "Are you sure you want to delete the following recipes? This action cannot be undone.", - "the-following-recipes-selected-length-will-be-exported": "The following recipes ({0}) will be exported.", + "confirm-delete-recipes": "你确定要删除以下食谱吗?此操作无法撤消。", + "the-following-recipes-selected-length-will-be-exported": "以下食谱 ({0}) 将被导出。", "settings-chosen-explanation": "Settings chosen here, excluding the locked option, will be applied to all selected recipes.", "selected-length-recipe-s-settings-will-be-updated": "{count} recipe(s) settings will be updated.", - "recipe-data": "Recipe Data", - "recipe-data-description": "Use this section to manage the data associated with your recipes. You can perform several bulk actions on your recipes including exporting, deleting, tagging, and assigning categories.", - "recipe-columns": "Recipe Columns", + "recipe-data": "食谱数据", + "recipe-data-description": "使用此部分来管理与食谱相关的数据。你可以对食谱进行一些批量操作,包括导出、删除、以及添加标签和分类。", + "recipe-columns": "食谱可选表头", "data-exports-description": "This section provides links to available exports that are ready to download. These exports do expire, so be sure to grab them while they're still available.", - "data-exports": "Data Exports", - "tag": "Tag", - "categorize": "Categorize", - "update-settings": "Update Settings", - "tag-recipes": "Tag Recipes", - "categorize-recipes": "Categorize Recipes", - "export-recipes": "Export Recipes", - "delete-recipes": "Delete Recipes", - "source-unit-will-be-deleted": "Source Unit will be deleted" + "data-exports": "已导出数据", + "tag": "添加标签", + "categorize": "添加分类", + "update-settings": "更新设置", + "tag-recipes": "给选中食谱添加标签", + "categorize-recipes": "给选中食谱添加分类", + "export-recipes": "导出食谱", + "delete-recipes": "删除食谱", + "source-unit-will-be-deleted": "“待合并单位”将会被删除" }, - "create-alias": "Create Alias", - "manage-aliases": "Manage Aliases", - "seed-data": "Seed Data", - "seed": "Seed", - "data-management": "Data Management", - "data-management-description": "Select which data set you want to make changes to.", - "select-data": "Select Data", - "select-language": "Select Language", - "columns": "Columns", - "combine": "Combine", + "create-alias": "创建别名", + "manage-aliases": "管理别名", + "seed-data": "初始数据", + "seed": "初始化", + "data-management": "数据管理", + "data-management-description": "选择你想要更改的数据集。", + "select-data": "选择数据", + "select-language": "选择语言", + "columns": "表头", + "combine": "合并", "categories": { - "edit-category": "Edit Category", - "new-category": "New Category", - "category-data": "Category Data" + "edit-category": "编辑分类", + "new-category": "新分类", + "category-data": "分类数据" }, "tags": { - "new-tag": "New Tag", - "edit-tag": "Edit Tag", - "tag-data": "Tag Data" + "new-tag": "新标签", + "edit-tag": "编辑标签", + "tag-data": "标签数据" }, "tools": { - "new-tool": "New Tool", - "edit-tool": "Edit Tool", - "tool-data": "Tool Data" + "new-tool": "新用具", + "edit-tool": "编辑用具", + "tool-data": "用具数据" } }, "user-registration": { - "user-registration": "User Registration", - "registration-success": "Registration Success", + "user-registration": "用户注册", + "registration-success": "注册成功", "join-a-group": "加入群组", "create-a-new-group": "创建新群组", "provide-registration-token-description": "请提供你想要加入的群组的注册令牌。你需要从现有的群组成员那里获得令牌。", "group-details": "群组详情", "group-details-description": "在你创建账户之前,需要先创建一个群组。此时群组将只包含你自己,但稍后你便可邀请其他人。 你的群组成员可以分享食谱、饮食计划、购物清单等!", - "use-seed-data": "Use Seed Data", + "use-seed-data": "使用初始数据", "use-seed-data-description": "Mealie附带一套现成的“食品”、“单位”、“标签”数据,可以帮助你的群组管理食谱。", - "account-details": "Account Details" + "account-details": "账户详情" }, "validation": { - "group-name-is-taken": "群组名称已被占用", - "username-is-taken": "Username is taken", - "email-is-taken": "Email is taken", + "group-name-is-taken": "群组名称已被使用", + "username-is-taken": "用户名已被使用", + "email-is-taken": "电子邮件已被使用", "this-field-is-required": "This Field is Required" }, "export": { @@ -1092,24 +1092,24 @@ "action-delete-log-files-description": "Deletes all the log files", "action-clean-directories-name": "Clean Directories", "action-clean-directories-description": "Removes all the recipe folders that are not valid UUIDs", - "action-clean-temporary-files-name": "Clean Temporary Files", - "action-clean-temporary-files-description": "Removes all files and folders in the .temp directory", + "action-clean-temporary-files-name": "清理临时文件", + "action-clean-temporary-files-description": "移除 .temp 目录中的所有文件和文件夹", "action-clean-images-name": "清理图片", - "action-clean-images-description": "Removes all the images that don't end with .webp", - "actions-description": "Maintenance actions are {destructive_in_bold} and should be used with caution. Performing any of these actions is {irreversible_in_bold}.", - "actions-description-destructive": "destructive", - "actions-description-irreversible": "irreversible", - "logs-action-refresh": "Refresh Logs", + "action-clean-images-description": "移除所有不以 .webp 结尾的图像", + "actions-description": "维护操作是 {destructive_in_bold} ,所以务必谨慎使用。 执行任何一个操作都是 {irreversible_in_bold}.", + "actions-description-destructive": "具有破坏性的", + "actions-description-irreversible": "不可逆的", + "logs-action-refresh": "刷新日志", "logs-page-title": "Mealie日志", - "logs-tail-lines-label": "Tail Lines" + "logs-tail-lines-label": "显示行数" }, "mainentance": { - "actions-title": "Actions" + "actions-title": "操作" }, "ingredients-natural-language-processor": "食材条目自然语言处理器", "ingredients-natural-language-processor-explanation": "Mealie用条件随机场(CRFs) 算法解析食材。模型的数据集则基于纽约时报编写的一个包含十万多种食材的数据库。注意该模型仅采用英文数据训练,因此用于其他语言时未必有好的效果。本页面用于测试模型效果。", - "ingredients-natural-language-processor-explanation-2": "It's not perfect, but it yields great results in general and is a good starting point for manually parsing ingredients into individual fields. Alternatively, you can also use the \"Brute\" processor that uses a pattern matching technique to identify ingredients.", - "nlp": "NLP", + "ingredients-natural-language-processor-explanation-2": "它不完美,但通常来说结果还不错。推荐用它上手来把食材手动解析成独立字段。或者,你也可以选择“Brute解析器“,它使用一种模式匹配技术来识别食材。", + "nlp": "自然语言处理", "brute": "Brute", "show-individual-confidence": "Show individual confidence", "ingredient-text": "Ingredient Text", @@ -1147,7 +1147,7 @@ "notifiers": "Notifiers", "notifiers-description": "设置邮件、基于特定事件推送通知", "manage-data": "Manage Data", - "manage-data-description": "Manage your Food and Units (more options coming soon)", + "manage-data-description": "管理食品和单位(将会提供更多选项)", "data-migrations": "Data Migrations", "data-migrations-description": "将现有数据从其他应用(如Nextcloud食谱、Chowdown)迁移至Mealie", "email-sent": "邮件已发送", @@ -1174,7 +1174,7 @@ "filter-options-description": "When require all is selected the cookbook will only include recipes that have all of the items selected. This applies to each subset of selectors and not a cross section of the selected items.", "require-all-categories": "Require All Categories", "require-all-tags": "需要所有标签", - "require-all-tools": "需要所有工具", + "require-all-tools": "需要所有用具", "cookbook-name": "食谱名称", "cookbook-with-name": "Cookbook {0}" } From f89586894c5afe930404b213d6950a60007f3ecf Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Mon, 25 Dec 2023 12:14:10 -0600 Subject: [PATCH 20/68] New translations en-us.json (Chinese Simplified) (#2877) --- frontend/lang/messages/zh-CN.json | 222 +++++++++++++++--------------- 1 file changed, 111 insertions(+), 111 deletions(-) diff --git a/frontend/lang/messages/zh-CN.json b/frontend/lang/messages/zh-CN.json index f1429f1288f0..759b7ca1d929 100644 --- a/frontend/lang/messages/zh-CN.json +++ b/frontend/lang/messages/zh-CN.json @@ -172,7 +172,7 @@ "date": "日期", "id": "Id", "owner": "所有者", - "date-added": "日期已添加", + "date-added": "添加日期", "none": "无", "run": "运行", "menu": "菜单", @@ -474,7 +474,7 @@ "recipe-added-to-mealplan": "已添加该食谱到饮食计划", "failed-to-add-recipes-to-list": "食谱未能添加到购物清单", "failed-to-add-recipe-to-mealplan": "添加食谱到饮食计划失败", - "yield": "Yield", + "yield": "菜量(几人份)", "quantity": "数量", "choose-unit": "选择单位", "press-enter-to-create": "按回车键以创建", @@ -550,7 +550,7 @@ "recipe-debugger-description": "Grab the URL of the recipe you want to debug and paste it here. The URL will be scraped by the recipe scraper and the results will be displayed. If you don't see any data returned, the site you are trying to scrape is not supported by Mealie or its scraper library.", "debug": "调试", "tree-view": "树状图", - "recipe-yield": "Recipe Yield", + "recipe-yield": "食谱菜量", "unit": "单位", "upload-image": "上传图片", "screen-awake": "保持屏幕唤醒", @@ -588,7 +588,7 @@ "delete-backup": "删除备份", "error-creating-backup-see-log-file": "创建备份时出错。请查看日志文件", "full-backup": "完整备份", - "import-summary": "导入摘要", + "import-summary": "导入概况", "partial-backup": "部分备份", "unable-to-delete-backup": "无法删除备份", "experimental-description": "Backups a total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think off this as a snapshot of Mealie at a specific time. Currently, {not-crossed-version} (data migrations are not done automatically). These serve as a database agnostic way to export and import data or backup the site to an external location.", @@ -695,9 +695,9 @@ "volumes-are-configured-correctly": "Volumes are configured correctly.", "status-unknown-try-running-a-validation": "Status Unknown. Try running a validation.", "validate": "验证", - "email-configuration-status": "电子邮件配置状态", - "email-configured": "已配置电子邮件", - "email-test-results": "电子邮件测试结果", + "email-configuration-status": "邮件服务配置状态", + "email-configured": "已配置邮件服务", + "email-test-results": "邮件服务测试结果", "ready": "已就绪", "not-ready": "尚未就绪,请检查环境变量", "succeeded": "成功", @@ -710,7 +710,7 @@ "secure-site-error-text": "运行于本机或受https保护,剪切板和一些浏览器API可能无法正常工作。", "secure-site-success-text": "本站点经由本机或https协议访问", "server-side-base-url": "服务器端根URL", - "server-side-base-url-error-text": "环境变量“BASE_URL“仍是API服务器上的默认值。这可能造成服务器自动发送的邮件内所包含的通知链接不可用等问题。", + "server-side-base-url-error-text": "环境变量“BASE_URL“仍是API服务器上的默认值。这可能造成服务器自动发送的邮件所包含的通知链接不可用等问题。", "server-side-base-url-success-text": "已配置服务器端URL", "ldap-ready": "LDAP 已就绪", "ldap-ready-error-text": "某些LDAP环境变量尚未配置。(如果你不使用LDAP验证可以忽略该报错)", @@ -744,7 +744,7 @@ "linked-recipes-count": "没有关联食谱|1个关联食谱|{count}个关联食谱", "items-checked-count": "No items checked|One item checked|{count} items checked", "no-label": "无标签", - "completed-on": "Completed on {date}" + "completed-on": "于 {date} 完成" }, "sidebar": { "all-recipes": "全部食谱", @@ -763,7 +763,7 @@ "language": "语言", "maintenance": "维护", "background-tasks": "后台任务", - "parser": "Parser", + "parser": "解析器", "developer": "开发人员", "cookbook": "食谱合集", "create-cookbook": "新建一个食谱合集" @@ -813,12 +813,12 @@ "current-password": "当前密码", "e-mail-must-be-valid": "电子邮件必须有效", "edit-user": "编辑用户", - "email": "电子邮件", + "email": "邮箱", "error-cannot-delete-super-user": "错误!无法删除超级用户", "existing-password-does-not-match": "与现有的密码不匹配", "full-name": "全名", "generate-password-reset-link": "生成重置密码链接", - "invite-only": "Invite Only", + "invite-only": "仅限邀请", "link-id": "链接ID", "link-name": "链接名", "login": "登录", @@ -831,9 +831,9 @@ "password-reset-failed": "密码重置失败", "password-updated": "密码已更新", "password": "密码", - "password-strength": "Password is {strength}", - "please-enter-password": "Please enter your new password.", - "register": "Register", + "password-strength": "密码强度: {strength}", + "please-enter-password": "请输入新密码。", + "register": "注册", "reset-password": "重置密码", "sign-in": "登入", "total-mealplans": "总饮食计划", @@ -853,25 +853,25 @@ "username": "用户名", "users-header": "用户", "users": "用户", - "user-not-found": "User not found", + "user-not-found": "未找到用户", "webhook-time": "Webhook时间", "webhooks-enabled": "Webhooks 启用", "you-are-not-allowed-to-create-a-user": "您无权创建用户", "you-are-not-allowed-to-delete-this-user": "您无权删除此用户", - "enable-advanced-content": "Enable Advanced Content", - "enable-advanced-content-description": "Enables advanced features like Recipe Scaling, API keys, Webhooks, and Data Management. Don't worry, you can always change this later", - "favorite-recipes": "Favorite Recipes", - "email-or-username": "Email or Username", - "remember-me": "Remember Me", - "please-enter-your-email-and-password": "Please enter your email and password", - "invalid-credentials": "Invalid Credentials", - "account-locked-please-try-again-later": "Account Locked. Please try again later", - "user-favorites": "User Favorites", + "enable-advanced-content": "启用高级内容", + "enable-advanced-content-description": "启用高级功能,如食谱、API密钥、Webhooks和数据管理。别纠结,你之后可以随时启用或禁用这个功能。", + "favorite-recipes": "我喜欢的食谱", + "email-or-username": "邮箱或用户名", + "remember-me": "保持登录状态", + "please-enter-your-email-and-password": "请输入您的邮箱和密码", + "invalid-credentials": "账号或密码错误", + "account-locked-please-try-again-later": "账户已被锁定,请稍后再试。", + "user-favorites": "我喜欢的食谱", "password-strength-values": { - "weak": "脆弱", - "good": "中等", - "strong": "优秀", - "very-strong": "超强" + "weak": "弱", + "good": "一般", + "strong": "强", + "very-strong": "非常强" }, "user-management": "多用户管理", "reset-locked-users": "解锁被锁定用户", @@ -888,22 +888,22 @@ "user-can-organize-group-data": "用户可以整理群组数据", "enable-advanced-features": "启用高级功能", "it-looks-like-this-is-your-first-time-logging-in": "看起来这是你第一次登录。", - "dont-want-to-see-this-anymore-be-sure-to-change-your-email": "不想再看到这条消息了吗?请务必在你的用户设置中更改电子邮件!", + "dont-want-to-see-this-anymore-be-sure-to-change-your-email": "不想再看到这条消息了吗?请务必在用户设置中更改你的邮箱!", "forgot-password": "忘记密码", - "forgot-password-text": "请输入你的电邮地址,我们会发给你重置密码的链接。", - "changes-reflected-immediately": "Changes to this user will be reflected immediately." + "forgot-password-text": "请输入你的邮箱地址,我们会发给你重置密码的链接。", + "changes-reflected-immediately": "对用户的更改将立即生效。" }, "language-dialog": { "translated": "已翻译", - "choose-language": "Choose Language", + "choose-language": "选择语言", "select-description": "选择Mealie UI的语言。该设置仅对你生效,不会影响其他用户。", - "how-to-contribute-description": "Is something not translated yet, mistranslated, or your language missing from the list? {read-the-docs-link} on how to contribute!", - "read-the-docs": "Read the docs" + "how-to-contribute-description": "是否存在未翻译、错翻译的地方,或是列表根本没有你的语言?{read-the-docs-link}了解如何贡献翻译!", + "read-the-docs": "阅读文档" }, "data-pages": { "foods": { "merge-dialog-text": "此操作将把“待合并食物”和“目标食物”合并为一个食物(即“目标食物”)。 “待合并食物”将会被删除 ,之前所有对“待合并食物”的引用都会指向“目标食物”。", - "merge-food-example": "Merging {food1} into {food2}", + "merge-food-example": "正在将{food1}合并到{food2}", "seed-dialog-text": "基于你的本地语言,将一些常见食物添加到数据库。(会有200多种常见食物被添加到你的数据库。食物名称由开源社区志愿者翻译。)", "seed-dialog-warning": "你的数据库中已经存在一些数据。此操作不会处理一些可能存在重复的条目,你需要手动管理它们。", "combine-food": "合并食品", @@ -946,15 +946,15 @@ }, "recipes": { "purge-exports": "Purge Exports", - "are-you-sure-you-want-to-delete-all-export-data": "Are you sure you want to delete all export data?", + "are-you-sure-you-want-to-delete-all-export-data": "你确认要删除所有导出的数据吗?", "confirm-delete-recipes": "你确定要删除以下食谱吗?此操作无法撤消。", "the-following-recipes-selected-length-will-be-exported": "以下食谱 ({0}) 将被导出。", - "settings-chosen-explanation": "Settings chosen here, excluding the locked option, will be applied to all selected recipes.", - "selected-length-recipe-s-settings-will-be-updated": "{count} recipe(s) settings will be updated.", + "settings-chosen-explanation": "除被锁定选项外,下列选择将被应用于所有已选中的食谱。", + "selected-length-recipe-s-settings-will-be-updated": "{count}个食谱配置将被更新。", "recipe-data": "食谱数据", "recipe-data-description": "使用此部分来管理与食谱相关的数据。你可以对食谱进行一些批量操作,包括导出、删除、以及添加标签和分类。", "recipe-columns": "食谱可选表头", - "data-exports-description": "This section provides links to available exports that are ready to download. These exports do expire, so be sure to grab them while they're still available.", + "data-exports-description": "此区域提供已准备就绪的导出数据的下载链接。这些导出数据一段时间后会过期,所以请抓紧下载。", "data-exports": "已导出数据", "tag": "添加标签", "categorize": "添加分类", @@ -1006,54 +1006,54 @@ "validation": { "group-name-is-taken": "群组名称已被使用", "username-is-taken": "用户名已被使用", - "email-is-taken": "电子邮件已被使用", - "this-field-is-required": "This Field is Required" + "email-is-taken": "邮箱已被使用", + "this-field-is-required": "此字段是必填字段" }, "export": { - "export": "Export", - "file-name": "File Name", - "size": "Size", - "link-expires": "Link Expires" + "export": "导出", + "file-name": "文件名", + "size": "大小", + "link-expires": "有效期" }, "recipe-share": { - "expiration-date": "Expiration Date", - "share-recipe": "Share Recipe", - "default-30-days": "Default 30 Days", - "expires-at": "Expires At", - "recipe-link-copied-message": "Recipe link copied to clipboard" + "expiration-date": "到期时间", + "share-recipe": "分享食谱", + "default-30-days": "默认30天", + "expires-at": "有效期至", + "recipe-link-copied-message": "已复制食谱链接到剪切板" }, "banner-experimental": { - "title": "Experimental Feature", - "description": "This page contains experimental or still-baking features. Please excuse the mess.", - "issue-link-text": "Track our progress here" + "title": "实验性功能", + "description": "此页面包含实验性或尚未成熟的功能,若体验不佳,恳请谅解。", + "issue-link-text": "在这里跟踪我们的进展。" }, "form": { "quantity-label-abbreviated": "数量" }, "markdown-editor": { - "preview-markdown-button-label": "Preview Markdown" + "preview-markdown-button-label": "预览Markdown" }, "demo": { - "info_message_with_version": "This is a Demo for version: {version}", - "demo_username": "Username: {username}", - "demo_password": "Password: {password}" + "info_message_with_version": "这是{version}版本的演示模式", + "demo_username": "\n用户名:{username}", + "demo_password": "密码:{password}" }, "ocr-editor": { - "ocr-editor": "Ocr editor", - "toolbar": "Toolbar", - "selection-mode": "Selection mode", - "pan-and-zoom-picture": "Pan and zoom picture", - "split-text": "Split text", - "preserve-line-breaks": "Preserve original line breaks", - "split-by-block": "Split by text block", - "flatten": "Flatten regardless of original formating", + "ocr-editor": "OCR编辑器", + "toolbar": "工具栏", + "selection-mode": "选择模式", + "pan-and-zoom-picture": "平移和缩放图片", + "split-text": "拆分文本", + "preserve-line-breaks": "保留原始换行", + "split-by-block": "按文本块拆分", + "flatten": "不保留原始格式", "help": { - "help": "Help", - "mouse-modes": "Mouse modes", - "selection-mode": "Selection Mode (default)", - "selection-mode-desc": "The selection mode is the main mode that can be used to enter data:", + "help": "帮助", + "mouse-modes": "鼠标模式", + "selection-mode": "选择模式 (默认)", + "selection-mode-desc": "选择模式是用来输入数据的主要模式:", "selection-mode-steps": { - "draw": "Draw a rectangle on the text you want to select.", + "draw": "框选你想要选择的文本。", "click": "Click on any field on the right and then click back on the rectangle above the image.", "result": "The selected text will appear inside the previously selected field." }, @@ -1072,26 +1072,26 @@ }, "admin": { "maintenance": { - "storage-details": "Storage Details", + "storage-details": "存储详情", "page-title": "站点维护", - "summary-title": "Summary", - "button-label-get-summary": "Get Summary", - "button-label-open-details": "Details", - "info-description-data-dir-size": "Data Directory Size", + "summary-title": "概况", + "button-label-get-summary": "获取概况", + "button-label-open-details": "详情", + "info-description-data-dir-size": "数据目录大小", "info-description-log-file-size": "日志文件大小", - "info-description-cleanable-directories": "Cleanable Directories", - "info-description-cleanable-images": "Cleanable Images", + "info-description-cleanable-directories": "可清除的目录", + "info-description-cleanable-images": "可清理的图像", "storage": { - "title-temporary-directory": "Temporary Directory (.temp)", - "title-backups-directory": "Backups Directory (backups)", - "title-groups-directory": "Groups Directory (groups)", - "title-recipes-directory": "Recipes Directory (recipes)", - "title-user-directory": "User Directory (user)" + "title-temporary-directory": "临时目录 (.temp)", + "title-backups-directory": "备份目录(backups)", + "title-groups-directory": "群组目录 (groups)", + "title-recipes-directory": "食谱目录 (recipes)", + "title-user-directory": "用户目录 (user)" }, - "action-delete-log-files-name": "Delete Log Files", - "action-delete-log-files-description": "Deletes all the log files", - "action-clean-directories-name": "Clean Directories", - "action-clean-directories-description": "Removes all the recipe folders that are not valid UUIDs", + "action-delete-log-files-name": "删除日志文件", + "action-delete-log-files-description": "删除所有日志文件", + "action-clean-directories-name": "清理目录", + "action-clean-directories-description": "移除所有名称为无效UUID的食谱文件夹", "action-clean-temporary-files-name": "清理临时文件", "action-clean-temporary-files-description": "移除 .temp 目录中的所有文件和文件夹", "action-clean-images-name": "清理图片", @@ -1111,23 +1111,23 @@ "ingredients-natural-language-processor-explanation-2": "它不完美,但通常来说结果还不错。推荐用它上手来把食材手动解析成独立字段。或者,你也可以选择“Brute解析器“,它使用一种模式匹配技术来识别食材。", "nlp": "自然语言处理", "brute": "Brute", - "show-individual-confidence": "Show individual confidence", - "ingredient-text": "Ingredient Text", - "average-confident": "{0} Confident", + "show-individual-confidence": "显示个体置信度", + "ingredient-text": "食材文本", + "average-confident": "{0}置信度", "try-an-example": "Try an example", - "parser": "Parser", - "background-tasks": "Background Tasks", - "background-tasks-description": "Here you can view all the running background tasks and their status", - "no-logs-found": "No Logs Found", + "parser": "解析器", + "background-tasks": "后台任务", + "background-tasks-description": "在这里你可以查看所有正在运行的后台任务及其状态", + "no-logs-found": "未找到日志", "tasks": "任务" }, "profile": { - "welcome-user": "👋 Welcome, {0}", + "welcome-user": "👋 欢迎,{0}", "description": "管理您的个人资料、菜谱和群组设置。", - "get-invite-link": "Get Invite Link", - "get-public-link": "Get Public Link", - "account-summary": "Account Summary", - "account-summary-description": "这是您的群组信息的摘要", + "get-invite-link": "生成邀请链接", + "get-public-link": "生成公开链接", + "account-summary": "账户概况", + "account-summary-description": "以下是你的群组概况", "group-statistics": "群组统计", "group-statistics-description": "群组统计为你如何使用Mealie提供一些深入信息。", "storage-capacity": "总储存容量", @@ -1140,12 +1140,12 @@ "group-description": "这些项目已在你的群组中共享,一旦被编辑,更改之处会对所有群组成员生效!", "group-settings": "群组设置", "group-settings-description": "管理常见的群组设置,如饮食计划和隐私设置。", - "cookbooks-description": "Manage a collection of recipe categories and generate pages for them.", + "cookbooks-description": "管理一套食谱分类并为它们生成页面。", "members": "成员", "members-description": "查看哪些人在你的群组中,并管理他们的权限。", "webhooks-description": "配置在你某天有饮食计划时,当日触发的webhooks。", "notifiers": "Notifiers", - "notifiers-description": "设置邮件、基于特定事件推送通知", + "notifiers-description": "设置基于特定事件触发的邮件提醒和通知推送。", "manage-data": "Manage Data", "manage-data-description": "管理食品和单位(将会提供更多选项)", "data-migrations": "Data Migrations", @@ -1155,10 +1155,10 @@ "personal-information": "Personal Information", "preferences": "Preferences", "show-advanced-description": "Show advanced features (API Keys, Webhooks, and Data Management)", - "back-to-profile": "Back to Profile", + "back-to-profile": "返回个人资料", "looking-for-privacy-settings": "Looking for Privacy Settings?", - "manage-your-api-tokens": "Manage Your API Tokens", - "manage-user-profile": "Manage User Profile", + "manage-your-api-tokens": "管理API令牌", + "manage-user-profile": "管理个人资料", "manage-cookbooks": "管理食谱合集", "manage-members": "管理成员", "manage-webhooks": "管理 Webhooks", @@ -1167,15 +1167,15 @@ }, "cookbook": { "cookbooks": "食谱合集", - "description": "Cookbooks are another way to organize recipes by creating cross sections of recipes and tags. Creating a cookbook will add an entry to the side-bar and all the recipes with the tags and categories chosen will be displayed in the cookbook.", + "description": "食谱合集是通过结合分类、标签两套系统来归纳食谱的方案。每创建一个合集,侧栏都会新增一个对应入口,所有满足该合集所指定标签与分类的食谱都会显示在此。", "public-cookbook": "公开食谱合集", "public-cookbook-description": "公开食谱合集可以分享和非Mealie用户,同时也会显示在你的群组页面上。", - "filter-options": "Filter Options", - "filter-options-description": "When require all is selected the cookbook will only include recipes that have all of the items selected. This applies to each subset of selectors and not a cross section of the selected items.", - "require-all-categories": "Require All Categories", - "require-all-tags": "需要所有标签", - "require-all-tools": "需要所有用具", + "filter-options": "过滤器选项", + "filter-options-description": "当“包含全部xx”选中时,食谱合集将仅保留那些xx中含有全部上方所选项的食谱。(xx指目录、标签或用具)", + "require-all-categories": "包含全部分类", + "require-all-tags": "包含全部标签", + "require-all-tools": "包含全部工具", "cookbook-name": "食谱名称", - "cookbook-with-name": "Cookbook {0}" + "cookbook-with-name": "{0}合集" } } From a1b36d936119ef3749449553e24ba8331693c1ee Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Tue, 26 Dec 2023 10:08:42 -0600 Subject: [PATCH 21/68] New translations en-us.json (Chinese Simplified) (#2878) --- frontend/lang/messages/zh-CN.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/lang/messages/zh-CN.json b/frontend/lang/messages/zh-CN.json index 759b7ca1d929..6f9d4ed93803 100644 --- a/frontend/lang/messages/zh-CN.json +++ b/frontend/lang/messages/zh-CN.json @@ -1156,7 +1156,7 @@ "preferences": "Preferences", "show-advanced-description": "Show advanced features (API Keys, Webhooks, and Data Management)", "back-to-profile": "返回个人资料", - "looking-for-privacy-settings": "Looking for Privacy Settings?", + "looking-for-privacy-settings": "正在寻找隐私设置?", "manage-your-api-tokens": "管理API令牌", "manage-user-profile": "管理个人资料", "manage-cookbooks": "管理食谱合集", From 9809167188dddf302d207d2565bd642a4fbe7697 Mon Sep 17 00:00:00 2001 From: boc-the-git <3479092+boc-the-git@users.noreply.github.com> Date: Wed, 27 Dec 2023 21:27:51 +1100 Subject: [PATCH 22/68] fix: Remove references to 'advanced' installation guide (#2880) --- docs/docs/documentation/getting-started/faq.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/docs/documentation/getting-started/faq.md b/docs/docs/documentation/getting-started/faq.md index 4a241003e684..cdc1227e8fab 100644 --- a/docs/docs/documentation/getting-started/faq.md +++ b/docs/docs/documentation/getting-started/faq.md @@ -64,9 +64,7 @@ No. Due to limitations from the Javascript Framework, mealie doesn't support ser ## Can I install Mealie without docker? -Yes, you can install Mealie on your local machine. HOWEVER, it is recommended that you don't. Managing non-system versions of python, node, and npm is a pain. Moreover, updating and upgrading your system with this configuration is unsupported and will likely require manual interventions. If you insist on installing Mealie on your local machine, you can use the links below to help guide your path. - -- [Advanced Installation](../installation/advanced/) +Yes, you can install Mealie on your local machine. HOWEVER, it is recommended that you don't. Managing non-system versions of python, node, and npm is a pain. Moreover, updating and upgrading your system with this configuration is unsupported and will likely require manual interventions. ## What is fuzzy search and how do I use it? Mealie can use fuzzy search, which is robust to minor typos. For example, searching for "brocolli" will still find your recipe for "broccoli soup". But fuzzy search is only functional on a Postgres database backend. To enable fuzzy search you will need to migrate to Postgres: From 73559bea91e8bdfa6391ea9b8721ae930a95140b Mon Sep 17 00:00:00 2001 From: boc-the-git <3479092+boc-the-git@users.noreply.github.com> Date: Thu, 28 Dec 2023 07:03:49 +1100 Subject: [PATCH 23/68] fix: Example file using wrong volume declaration (#2872) Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com> --- .../docs/documentation/getting-started/installation/postgres.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/documentation/getting-started/installation/postgres.md b/docs/docs/documentation/getting-started/installation/postgres.md index fa88e8b6c912..f98f6b22a7ff 100644 --- a/docs/docs/documentation/getting-started/installation/postgres.md +++ b/docs/docs/documentation/getting-started/installation/postgres.md @@ -46,7 +46,7 @@ services: image: postgres:15 restart: always volumes: - - ./mealie-pgdata:/var/lib/postgresql/data + - mealie-pgdata:/var/lib/postgresql/data environment: POSTGRES_PASSWORD: mealie POSTGRES_USER: mealie From ece11a5f39d52b0a6853b375097ffe8770c3eaab Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Wed, 27 Dec 2023 16:19:12 -0600 Subject: [PATCH 24/68] fix: remove username/password banner (#2881) * remove username/password banner * remove divider --- frontend/layouts/blank.vue | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/frontend/layouts/blank.vue b/frontend/layouts/blank.vue index 2cc3006e06d0..d3f7c88a01a4 100644 --- a/frontend/layouts/blank.vue +++ b/frontend/layouts/blank.vue @@ -4,9 +4,7 @@
- {{ $t("demo.info_message_with_version", { version: version }) }} | - {{ $t("demo.demo_username", { username: "changeme@example.com" }) }} | - {{ $t("demo.demo_password", { password: "demo" }) }} + {{ $t("demo.info_message_with_version", { version: version }) }}
From 46cb36212a7dfbfbe051fed1782dba1fdcc00b9b Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Thu, 28 Dec 2023 07:52:29 -0600 Subject: [PATCH 25/68] New Crowdin updates (#2883) * New translations en-us.json (Greek) * New translations en-us.json (Greek) * New translations en-us.json (Greek) * New translations en-us.json (Chinese Simplified) * New translations en-us.json (Chinese Traditional) --------- Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> --- frontend/lang/messages/zh-TW.json | 12 +++---- .../seed/resources/foods/locales/el-GR.json | 32 +++++++++---------- .../seed/resources/labels/locales/el-GR.json | 26 +++++++-------- .../seed/resources/labels/locales/zh-CN.json | 6 ++-- .../seed/resources/units/locales/el-GR.json | 16 +++++----- 5 files changed, 46 insertions(+), 46 deletions(-) diff --git a/frontend/lang/messages/zh-TW.json b/frontend/lang/messages/zh-TW.json index d2aea605e3e7..a5a5e369ce11 100644 --- a/frontend/lang/messages/zh-TW.json +++ b/frontend/lang/messages/zh-TW.json @@ -177,25 +177,25 @@ "run": "運行", "menu": "選單", "a-name-is-required": "名稱必填", - "delete-with-name": "Delete {name}", + "delete-with-name": "刪除 {name}", "confirm-delete-generic-with-name": "Are you sure you want to delete this {name}?", "confirm-delete-own-admin-account": "Please note that you are trying to delete your own admin account! This action cannot be undone and will permanently delete your account?", "organizer": "Organizer", "transfer": "Transfer", "copy": "複製", - "color": "Color", + "color": "色彩", "timestamp": "時間戳", "last-made": "最後製作的", - "learn-more": "Learn More", + "learn-more": "學習更多", "this-feature-is-currently-inactive": "該功能目前處於非活動狀態", "clipboard-not-supported": "Clipboard not supported", - "copied-to-clipboard": "Copied to clipboard", + "copied-to-clipboard": "複製到剪貼簿", "your-browser-does-not-support-clipboard": "Your browser does not support clipboard", "copied-items-to-clipboard": "No item copied to clipboard|One item copied to clipboard|Copied {count} items to clipboard", "actions": "Actions", "selected-count": "Selected: {count}", "export-all": "Export All", - "refresh": "Refresh", + "refresh": "更新", "upload-file": "上傳文件", "created-on-date": "Created on: {0}", "unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes." @@ -224,7 +224,7 @@ "keep-my-recipes-private": "將我的食譜保密", "keep-my-recipes-private-description": "Sets your group and all recipes defaults to private. You can always change this later." }, - "manage-members": "Manage Members", + "manage-members": "管理成員", "manage-members-description": "Manage the permissions of the members in your groups. {manage} allows the user to access the data-management page {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.", "manage": "Manage", "invite": "邀請", diff --git a/mealie/repos/seed/resources/foods/locales/el-GR.json b/mealie/repos/seed/resources/foods/locales/el-GR.json index eaf783db0c9f..a6c20213cef6 100644 --- a/mealie/repos/seed/resources/foods/locales/el-GR.json +++ b/mealie/repos/seed/resources/foods/locales/el-GR.json @@ -23,7 +23,7 @@ "broccolini": "broccolini", "broccoli-rabe": "broccoli rabe", "brussels-sprouts": "λαχανάκια Βρυξελλών", - "cabbage": "cabbage", + "cabbage": "λάχανο", "cauliflower": "κουνουπίδι", "chinese-leaves": "κινέζικα φύλλα", "collard-greens": "collard greens", @@ -52,34 +52,34 @@ "chicory": "chicory", "chilli-peppers": "chilli peppers", "chives": "chives", - "chocolate": "chocolate", - "cilantro": "cilantro", - "cinnamon": "cinnamon", + "chocolate": "σοκολάτα", + "cilantro": "κόλιανδρος", + "cinnamon": "κανέλα", "clarified-butter": "clarified butter", - "coconut": "coconut", - "coconut-milk": "coconut milk", - "coffee": "coffee", + "coconut": "καρύδα", + "coconut-milk": "γάλα καρύδας", + "coffee": "καφές", "confectioners-sugar": "confectioners' sugar", - "coriander": "coriander", - "corn": "corn", + "coriander": "κόλιανδρος", + "corn": "καλαμπόκι", "corn-syrup": "corn syrup", "cottonseed-oil": "cottonseed oil", "courgette": "courgette", "cream-of-tartar": "cream of tartar", - "cucumber": "cucumber", - "cumin": "cumin", + "cucumber": "αγγούρι", + "cumin": "κύμινο", "daikon": "daikon", "dairy-products-and-dairy-substitutes": "dairy products and dairy substitutes", - "eggs": "eggs", + "eggs": "αυγά", "ghee": "ghee", - "milk": "milk", + "milk": "γάλα", "dandelion": "dandelion", "demerara-sugar": "demerara sugar", - "dough": "dough", + "dough": "ζυμάρι", "edible-cactus": "edible cactus", - "eggplant": "eggplant", + "eggplant": "μελιτζάνα", "endive": "endive", - "fats": "fats", + "fats": "λιπαρά", "speck": "speck", "fava-beans": "fava beans", "fiddlehead": "fiddlehead", diff --git a/mealie/repos/seed/resources/labels/locales/el-GR.json b/mealie/repos/seed/resources/labels/locales/el-GR.json index fe4d0175fcb7..a267bed7c74a 100644 --- a/mealie/repos/seed/resources/labels/locales/el-GR.json +++ b/mealie/repos/seed/resources/labels/locales/el-GR.json @@ -3,22 +3,22 @@ "name": "Produce" }, { - "name": "Grains" + "name": "Σιτηρά" }, { - "name": "Fruits" + "name": "Φρούτα" }, { - "name": "Vegetables" + "name": "Λαχανικά" }, { - "name": "Meat" + "name": "Κρέας" }, { - "name": "Seafood" + "name": "Θαλασσινά" }, { - "name": "Beverages" + "name": "Ποτά" }, { "name": "Baked Goods" @@ -33,10 +33,10 @@ "name": "Confectionary" }, { - "name": "Dairy Products" + "name": "Γαλακτοκομικά" }, { - "name": "Frozen Foods" + "name": "Κατεψυγμένα Φαγητά" }, { "name": "Health Foods" @@ -48,18 +48,18 @@ "name": "Meat Products" }, { - "name": "Snacks" + "name": "Σνακ" }, { - "name": "Spices" + "name": "Μπαχαρικά" }, { - "name": "Sweets" + "name": "Γλυκά" }, { - "name": "Alcohol" + "name": "Αλκοόλ" }, { - "name": "Other" + "name": "Άλλα" } ] diff --git a/mealie/repos/seed/resources/labels/locales/zh-CN.json b/mealie/repos/seed/resources/labels/locales/zh-CN.json index 827b7313c627..f37e262a4b77 100644 --- a/mealie/repos/seed/resources/labels/locales/zh-CN.json +++ b/mealie/repos/seed/resources/labels/locales/zh-CN.json @@ -1,6 +1,6 @@ [ { - "name": "Produce" + "name": "农产品" }, { "name": "谷物" @@ -30,7 +30,7 @@ "name": "调味品" }, { - "name": "Confectionary" + "name": "糖果类" }, { "name": "乳制品" @@ -54,7 +54,7 @@ "name": "调味品" }, { - "name": "甜味剂" + "name": "甜食" }, { "name": "酒类" diff --git a/mealie/repos/seed/resources/units/locales/el-GR.json b/mealie/repos/seed/resources/units/locales/el-GR.json index 0ef53f6336b6..bc9717fe83f4 100644 --- a/mealie/repos/seed/resources/units/locales/el-GR.json +++ b/mealie/repos/seed/resources/units/locales/el-GR.json @@ -2,17 +2,17 @@ "teaspoon": { "name": "teaspoon", "description": "", - "abbreviation": "tsp" + "abbreviation": "κ.γ." }, "tablespoon": { "name": "tablespoon", "description": "", - "abbreviation": "tbsp" + "abbreviation": "κ.σ." }, "cup": { - "name": "cup", + "name": "φλιτζάνι", "description": "", - "abbreviation": "cup" + "abbreviation": "φλ." }, "fluid-ounce": { "name": "fluid ounce", @@ -42,7 +42,7 @@ "liter": { "name": "λίτρο", "description": "", - "abbreviation": "λ" + "abbreviation": "l" }, "pound": { "name": "pound", @@ -57,17 +57,17 @@ "gram": { "name": "γραμ", "description": "", - "abbreviation": "γ" + "abbreviation": "γρ." }, "kilogram": { "name": "κιλό", "description": "", - "abbreviation": "κιλ" + "abbreviation": "kg" }, "milligram": { "name": "χιλιοστόγραμμο", "description": "", - "abbreviation": "μιλιγκράμ" + "abbreviation": "mg" }, "splash": { "name": "splash", From f6f9a1c5324abaa8d5653efbc4f1cdd8f4819d75 Mon Sep 17 00:00:00 2001 From: Hayden <64056131+hay-kot@users.noreply.github.com> Date: Fri, 29 Dec 2023 07:53:02 -0600 Subject: [PATCH 26/68] New translations en-us.json (Italian) (#2887) --- frontend/lang/messages/it-IT.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/lang/messages/it-IT.json b/frontend/lang/messages/it-IT.json index 2c3bbe3884ba..ffab221390bb 100644 --- a/frontend/lang/messages/it-IT.json +++ b/frontend/lang/messages/it-IT.json @@ -77,7 +77,7 @@ "tag-events": "Tag Eventi", "category-events": "Categoria Eventi", "when-a-new-user-joins-your-group": "Quando un nuovo utente entra nel tuo gruppo", - "recipe-events": "Recipe Events" + "recipe-events": "Eventi di ricette" }, "general": { "cancel": "Cancella", @@ -198,7 +198,7 @@ "refresh": "Ricarica", "upload-file": "Carica file", "created-on-date": "Creato il: {0}", - "unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes." + "unsaved-changes": "Sono state apportate modifiche non salvate. Salvare prima di uscire? Premi Ok per salvare, Annulla per scartare le modifiche." }, "group": { "are-you-sure-you-want-to-delete-the-group": "Sei sicuro di volerlo eliminare {groupName}'?", @@ -213,7 +213,7 @@ "group-id-with-value": "ID Gruppo:{groupID}", "group-name": "Nome Gruppo", "group-not-found": "Gruppo non trovato", - "group-token": "Group Token", + "group-token": "Token del gruppo", "group-with-value": "Gruppo: {groupID}", "groups": "Gruppi", "manage-groups": "Gestisci Gruppi", @@ -249,7 +249,7 @@ "general-preferences": "Impostazioni Generali", "group-recipe-preferences": "Impostazioni per le ricette del gruppo", "report": "Report", - "report-with-id": "Report ID: {id}", + "report-with-id": "ID Report: {id}", "group-management": "Gestione Gruppo", "admin-group-management": "Gestione Gruppo Amministratore", "admin-group-management-text": "Le modifiche a questo gruppo si rifletteranno immediatamente.", @@ -304,7 +304,7 @@ "for-type-meal-types": "per {0} tipi di pasto", "meal-plan-rules": "Regole del piano alimentare", "new-rule": "Nuova regola", - "meal-plan-rules-description": "You can create rules for auto selecting recipes for your meal plans. These rules are used by the server to determine the random pool of recipes to select from when creating meal plans. Note that if rules have the same day/type constraints then the categories of the rules will be merged. In practice, it's unnecessary to create duplicate rules, but it's possible to do so.", + "meal-plan-rules-description": "Puoi creare regole per la selezione automatica delle ricette per i tuoi piani alimentari. Queste regole vengono utilizzate dal server per determinare le ricette da selezionare durante la creazione dei piani alimentari. Tieni presente che se le regole hanno gli stessi vincoli di giorno/tipo, le categorie delle regole verranno unite. In pratica non è necessario creare regole duplicate, ma è possibile farlo.", "new-rule-description": "Quando si crea una nuova regola per un piano alimentare è possibile limitare la sua applicazione ad un giorno specifico della settimana e/o un tipo specifico di pasto. Per applicare una regola a tutti i giorni o a tutti i tipi di pasto, è possibile impostare la regola a \"Qualsiasi\", applicandola a tutti i possibili valori per il tipo di giorno e/o di pasto.", "recipe-rules": "Regole per le ricette", "applies-to-all-days": "Si applica a ogni giorno", From 6a71af98bde8c69bdcc91b1c77cb1b7127560185 Mon Sep 17 00:00:00 2001 From: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> Date: Fri, 29 Dec 2023 16:48:28 +0100 Subject: [PATCH 27/68] fix: show copy to clipboard failure (#2886) * fix for AppButtonCopy * add some logging * fix if statement * refactor, use .then * check for copied * Fix recipe share link * refactor AppButtonCopy * update tooltip text * update use-copy * logging * fix is supported check * more fixes for use-copy.ts --------- Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com> --- .../Domain/Recipe/RecipeDialogShare.vue | 16 ++++++++-- frontend/components/global/AppButtonCopy.vue | 29 ++++++++++++++----- frontend/composables/use-copy.ts | 25 ++++++++++++---- frontend/lang/messages/en-US.json | 3 +- 4 files changed, 55 insertions(+), 18 deletions(-) diff --git a/frontend/components/Domain/Recipe/RecipeDialogShare.vue b/frontend/components/Domain/Recipe/RecipeDialogShare.vue index d62ccfc9843c..f64aa341588b 100644 --- a/frontend/components/Domain/Recipe/RecipeDialogShare.vue +++ b/frontend/components/Domain/Recipe/RecipeDialogShare.vue @@ -143,7 +143,7 @@ export default defineComponent({ } const { share, isSupported: shareIsSupported } = useShare(); - const { copy } = useClipboard(); + const { copy, copied, isSupported } = useClipboard(); function getRecipeText() { return i18n.t("recipe.share-recipe-message", [props.name]); @@ -154,8 +154,18 @@ export default defineComponent({ } async function copyTokenLink(token: string) { - await copy(getTokenLink(token)); - alert.success(i18n.t("recipe-share.recipe-link-copied-message") as string); + if (isSupported.value) { + await copy(getTokenLink(token)); + if (copied.value) { + alert.success(i18n.t("recipe-share.recipe-link-copied-message") as string); + } + else { + alert.error(i18n.t("general.clipboard-copy-failure") as string); + } + } + else { + alert.error(i18n.t("general.clipboard-not-supported") as string); + } } async function shareRecipe(token: string) { diff --git a/frontend/components/global/AppButtonCopy.vue b/frontend/components/global/AppButtonCopy.vue index 2f8fcf94bf11..09bbadcff47c 100644 --- a/frontend/components/global/AppButtonCopy.vue +++ b/frontend/components/global/AppButtonCopy.vue @@ -2,7 +2,7 @@ {{ $globals.icons.clipboardCheck }} - {{ $t("general.copied_message") }} + {{ $t("general.your-browser-does-not-support-clipboard") }} + {{ copied ? $t("general.copied_message") : $t("general.clipboard-copy-failure") }}