Compare commits

...

35 Commits

Author SHA1 Message Date
renovate[bot]
2d73c703cb fix(deps): update dependency openai to v1.61.1 (#5020)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-05 21:40:03 +00:00
Hayden
10315fe8f7 chore(l10n): New Crowdin updates (#5021)
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
2025-02-05 21:29:56 +00:00
renovate[bot]
1f7d5a57af chore(deps): update dependency mypy to v1.15.0 (#5017)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-05 14:21:39 +01:00
Hayden
6d22df7b95 chore(l10n): New Crowdin updates (#5018) 2025-02-05 11:16:20 +01:00
Hayden
f5ddcdf193 chore(l10n): New Crowdin updates (#5016) 2025-02-04 17:36:45 +01:00
renovate[bot]
36f6917308 chore(deps): update dependency mkdocs-material to v9.6.2 (#5011)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-03 18:34:00 +01:00
github-actions[bot]
53b5df92ae chore(auto): Update pre-commit hooks (#5008)
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
2025-02-03 11:31:16 +00:00
renovate[bot]
736352af5f chore(deps): update dependency mkdocs-material to v9.6.1 (#4992)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-03 12:21:36 +01:00
renovate[bot]
41940b8003 fix(deps): update dependency openai to v1.61.0 (#4995)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-01 09:15:42 +01:00
Hayden
641d24aa1e fix: revert "feat: Add new labels and foods for en-US language" (#4996) 2025-01-31 22:46:57 -06:00
Cameronwyatt
fb08a11ffe feat: Add new labels and foods for en-US language
Update all locale seeding files and seeding logic to parse the new format Only add new labels, units, and foods during seeding (checking against existing names)
2025-02-01 02:17:43 +00:00
renovate[bot]
ba26378abc fix(deps): update dependency rapidfuzz to v3.12.1 (#4990)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-30 19:27:58 -06:00
Hayden
2a4b0d3d8b chore(l10n): New Crowdin updates (#4991) 2025-01-30 18:52:37 -06:00
renovate[bot]
af4b3fa83d fix(deps): update dependency fastapi to v0.115.8 (#4989)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-30 17:40:55 -06:00
renovate[bot]
564012c53d fix(deps): update dependency authlib to v1.4.1 (#4971)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-30 22:55:14 +00:00
renovate[bot]
2316a3fef9 chore(deps): update dependency ruff to v0.9.4 (#4988)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-30 16:43:59 -06:00
PancakeZik
a52fda72d6 fix: Fixed LastMade recipes sorting order (#4980)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-01-30 10:33:58 +01:00
Michael Genson
cb05adeb48 fix: Remove API Tokens from User APIs (#4985) 2025-01-29 19:52:12 +00:00
Felix Schneider
f2eadd2908 fix: Ensure bring api docs are shown (PR 4920) (#4948)
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
2025-01-29 12:10:18 -06:00
renovate[bot]
4229061377 chore(deps): update dependency pytest-asyncio to v0.25.3 (#4972)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-29 10:08:12 +01:00
renovate[bot]
970ed1da7b chore(deps): update dependency pylint to v3.3.4 (#4970)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-29 09:11:18 +01:00
Hayden
dd9d9b85c1 chore(l10n): New Crowdin updates (#4975) 2025-01-29 08:15:16 +01:00
Hayden
6001d679e7 chore(l10n): New Crowdin updates (#4968)
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
2025-01-28 07:41:25 +00:00
renovate[bot]
02cf53340b fix(deps): update dependency openai to v1.60.2 (#4967)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-28 08:31:55 +01:00
github-actions[bot]
95042f1d40 chore(auto): Update pre-commit hooks (#4965)
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
2025-01-27 08:01:18 +00:00
Michael Genson
34245687a5 feat: Add Servings/Yield to Recipe Actions (#4952)
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
2025-01-27 07:37:09 +00:00
Hayden
7e5c750231 chore(l10n): New Crowdin updates (#4953) 2025-01-27 08:19:45 +01:00
Cody
93c2df41c3 feat: Shopping list UI overhaul - three dot menu (#4415)
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
2025-01-26 14:04:40 +00:00
James Elliott
1e69577d12 docs: update oidcv2 authelia link (#4942)
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
2025-01-25 01:48:34 +00:00
renovate[bot]
cbafc28fa1 fix(deps): update dependency openai to v1.60.1 (#4941)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-24 22:59:56 +01:00
renovate[bot]
8622e19502 chore(deps): update dependency ruff to v0.9.3 (#4939)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-23 15:14:55 -06:00
Hayden
2fee1778ed chore(l10n): New Crowdin updates (#4938) 2025-01-23 21:42:22 +01:00
renovate[bot]
2284ecb226 fix(deps): update dependency fastapi to v0.115.7 (#4935)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-23 11:22:02 -06:00
github-actions[bot]
2716260473 docs(auto): Update image tag, for release v2.5.0 (#4933)
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
2025-01-22 21:00:40 +00:00
Hayden
0b89ab1a95 chore(l10n): New Crowdin updates (#4934) 2025-01-22 14:51:47 -06:00
51 changed files with 814 additions and 752 deletions

View File

@@ -12,7 +12,7 @@ repos:
exclude: ^tests/data/ exclude: ^tests/data/
- repo: https://github.com/astral-sh/ruff-pre-commit - repo: https://github.com/astral-sh/ruff-pre-commit
# Ruff version. # Ruff version.
rev: v0.9.2 rev: v0.9.4
hooks: hooks:
- id: ruff - id: ruff
- id: ruff-format - id: ruff-format

View File

@@ -10,7 +10,7 @@
Mealie supports 3rd party authentication via [OpenID Connect (OIDC)](https://openid.net/connect/), an identity layer built on top of OAuth2. OIDC is supported by many Identity Providers (IdP), including: Mealie supports 3rd party authentication via [OpenID Connect (OIDC)](https://openid.net/connect/), an identity layer built on top of OAuth2. OIDC is supported by many Identity Providers (IdP), including:
- [Authentik](https://goauthentik.io/integrations/sources/oauth/#openid-connect) - [Authentik](https://goauthentik.io/integrations/sources/oauth/#openid-connect)
- [Authelia](https://www.authelia.com/configuration/identity-providers/open-id-connect/) - [Authelia](https://www.authelia.com/integration/openid-connect/mealie/)
- [Keycloak](https://www.keycloak.org/docs/latest/securing_apps/#_oidc) - [Keycloak](https://www.keycloak.org/docs/latest/securing_apps/#_oidc)
- [Okta](https://www.okta.com/openid-connect/) - [Okta](https://www.okta.com/openid-connect/)

View File

@@ -139,6 +139,9 @@ Below is a list of all valid merge fields:
- ${id} - ${id}
- ${slug} - ${slug}
- ${url} - ${url}
- ${servings}
- ${yieldQuantity}
- ${yieldText}
To add, modify, or delete Recipe Actions, visit the Data Management page (more on that below). To add, modify, or delete Recipe Actions, visit the Data Management page (more on that below).

View File

@@ -31,7 +31,7 @@ To deploy mealie on your local network, it is highly recommended to use Docker t
We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment, and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers _or_ the omni image) to the new nightly, there are a few things you need to do: We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment, and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers _or_ the omni image) to the new nightly, there are a few things you need to do:
1. Take a backup just in case! 1. Take a backup just in case!
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v2.4.2` 2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v2.5.0`
3. Take the external port from the frontend container and set that as the port mapped to port `9000` on the new container. The frontend is now served on port 9000 from the new container, so it will need to be mapped for you to have access. 3. Take the external port from the frontend container and set that as the port mapped to port `9000` on the new container. The frontend is now served on port 9000 from the new container, so it will need to be mapped for you to have access.
4. Restart the container 4. Restart the container

View File

@@ -7,7 +7,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In
```yaml ```yaml
services: services:
mealie: mealie:
image: ghcr.io/mealie-recipes/mealie:v2.4.2 # (3) image: ghcr.io/mealie-recipes/mealie:v2.5.0 # (3)
container_name: mealie container_name: mealie
restart: always restart: always
ports: ports:

View File

@@ -11,7 +11,7 @@ SQLite is a popular, open source, self-contained, zero-configuration database th
```yaml ```yaml
services: services:
mealie: mealie:
image: ghcr.io/mealie-recipes/mealie:v2.4.2 # (3) image: ghcr.io/mealie-recipes/mealie:v2.5.0 # (3)
container_name: mealie container_name: mealie
restart: always restart: always
ports: ports:

View File

@@ -85,12 +85,13 @@ nav:
- OpenID Connect: "documentation/getting-started/authentication/oidc-v2.md" - OpenID Connect: "documentation/getting-started/authentication/oidc-v2.md"
- Community Guides: - Community Guides:
- Bring API without internet exposure: "documentation/community-guide/bring-api.md"
- Automate Backups with n8n: "documentation/community-guide/n8n-backup-automation.md"
- Bulk Url Import: "documentation/community-guide/bulk-url-import.md"
- Home Assistant: "documentation/community-guide/home-assistant.md"
- Import Bookmarklet: "documentation/community-guide/import-recipe-bookmarklet.md"
- iOS Shortcuts: "documentation/community-guide/ios.md" - iOS Shortcuts: "documentation/community-guide/ios.md"
- Reverse Proxy (SWAG): "documentation/community-guide/swag.md" - Reverse Proxy (SWAG): "documentation/community-guide/swag.md"
- Home Assistant: "documentation/community-guide/home-assistant.md"
- Bulk Url Import: "documentation/community-guide/bulk-url-import.md"
- Import Bookmarklet: "documentation/community-guide/import-recipe-bookmarklet.md"
- Automate Backups with n8n: "documentation/community-guide/n8n-backup-automation.md"
- API Reference: "api/redoc.md" - API Reference: "api/redoc.md"

View File

@@ -236,14 +236,17 @@ export default defineComponent({
}); });
async function fetchRecipes(pageCount = 1) { async function fetchRecipes(pageCount = 1) {
const orderDir = props.query?.orderDirection || preferences.value.orderDirection;
const orderByNullPosition = props.query?.orderByNullPosition || orderDir === "asc" ? "first" : "last";
return await fetchMore( return await fetchMore(
page.value, page.value,
perPage * pageCount, perPage * pageCount,
props.query?.orderBy || preferences.value.orderBy, props.query?.orderBy || preferences.value.orderBy,
props.query?.orderDirection || preferences.value.orderDirection, orderDir,
orderByNullPosition,
props.query, props.query,
// we use a computed queryFilter to filter out recipes that have a null value for the property we're sorting by // we use a computed queryFilter to filter out recipes that have a null value for the property we're sorting by
queryFilter.value queryFilter.value,
); );
} }

View File

@@ -371,7 +371,7 @@ export default defineComponent({
const groupRecipeActionsStore = useGroupRecipeActions(); const groupRecipeActionsStore = useGroupRecipeActions();
async function executeRecipeAction(action: GroupRecipeActionOut) { async function executeRecipeAction(action: GroupRecipeActionOut) {
const response = await groupRecipeActionsStore.execute(action, props.recipe); const response = await groupRecipeActionsStore.execute(action, props.recipe, props.recipeScale);
if (action.actionType === "post") { if (action.actionType === "post") {
if (!response?.error) { if (!response?.error) {

View File

@@ -2,7 +2,7 @@ import { useAsync, useRouter, ref } from "@nuxtjs/composition-api";
import { useAsyncKey } from "../use-utils"; import { useAsyncKey } from "../use-utils";
import { usePublicExploreApi } from "~/composables/api/api-client"; import { usePublicExploreApi } from "~/composables/api/api-client";
import { useUserApi } from "~/composables/api"; import { useUserApi } from "~/composables/api";
import { Recipe } from "~/lib/api/types/recipe"; import { OrderByNullPosition, Recipe } from "~/lib/api/types/recipe";
import { RecipeSearchQuery } from "~/lib/api/user/recipes/recipe"; import { RecipeSearchQuery } from "~/lib/api/user/recipes/recipe";
export const allRecipes = ref<Recipe[]>([]); export const allRecipes = ref<Recipe[]>([]);
@@ -11,12 +11,14 @@ export const recentRecipes = ref<Recipe[]>([]);
function getParams( function getParams(
orderBy: string | null = null, orderBy: string | null = null,
orderDirection = "desc", orderDirection = "desc",
orderByNullPosition: OrderByNullPosition | null = null,
query: RecipeSearchQuery | null = null, query: RecipeSearchQuery | null = null,
queryFilter: string | null = null queryFilter: string | null = null
) { ) {
return { return {
orderBy, orderBy,
orderDirection, orderDirection,
orderByNullPosition,
paginationSeed: query?._searchSeed, // propagate searchSeed to stabilize random order pagination paginationSeed: query?._searchSeed, // propagate searchSeed to stabilize random order pagination
searchSeed: query?._searchSeed, // unused, but pass it along for completeness of data searchSeed: query?._searchSeed, // unused, but pass it along for completeness of data
search: query?.search, search: query?.search,
@@ -47,6 +49,7 @@ export const useLazyRecipes = function (publicGroupSlug: string | null = null) {
perPage: number, perPage: number,
orderBy: string | null = null, orderBy: string | null = null,
orderDirection = "desc", orderDirection = "desc",
orderByNullPosition: OrderByNullPosition | null = null,
query: RecipeSearchQuery | null = null, query: RecipeSearchQuery | null = null,
queryFilter: string | null = null, queryFilter: string | null = null,
) { ) {
@@ -54,7 +57,7 @@ export const useLazyRecipes = function (publicGroupSlug: string | null = null) {
const { data, error } = await api.recipes.getAll( const { data, error } = await api.recipes.getAll(
page, page,
perPage, perPage,
getParams(orderBy, orderDirection, query, queryFilter), getParams(orderBy, orderDirection, orderByNullPosition, query, queryFilter),
); );
if (error?.response?.status === 404) { if (error?.response?.status === 404) {
@@ -88,7 +91,7 @@ export const useLazyRecipes = function (publicGroupSlug: string | null = null) {
} }
async function getRandom(query: RecipeSearchQuery | null = null, queryFilter: string | null = null) { async function getRandom(query: RecipeSearchQuery | null = null, queryFilter: string | null = null) {
const { data } = await api.recipes.getAll(1, 1, getParams("random", "desc", query, queryFilter)); const { data } = await api.recipes.getAll(1, 1, getParams("random", "desc", null, query, queryFilter));
if (data?.items.length) { if (data?.items.length) {
return data.items[0]; return data.items[0];
} }

View File

@@ -46,17 +46,23 @@ export const useGroupRecipeActions = function (
return groupRecipeActions.value; return groupRecipeActions.value;
}); });
function parseRecipeActionUrl(url: string, recipe: Recipe): string { function parseRecipeActionUrl(url: string, recipe: Recipe, recipeScale: number): string {
const recipeServings = (recipe.recipeServings || 1) * recipeScale;
const recipeYieldQuantity = (recipe.recipeYieldQuantity || 1) * recipeScale;
/* eslint-disable no-template-curly-in-string */ /* eslint-disable no-template-curly-in-string */
return url return url
.replace("${url}", window.location.href) .replace("${url}", window.location.href)
.replace("${id}", recipe.id || "") .replace("${id}", recipe.id || "")
.replace("${slug}", recipe.slug || "") .replace("${slug}", recipe.slug || "")
.replace("${servings}", recipeServings.toString())
.replace("${yieldQuantity}", recipeYieldQuantity.toString())
.replace("${yieldText}", recipe.recipeYield || "")
/* eslint-enable no-template-curly-in-string */ /* eslint-enable no-template-curly-in-string */
}; };
async function execute(action: GroupRecipeActionOut, recipe: Recipe): Promise<void | RequestResponse<unknown>> { async function execute(action: GroupRecipeActionOut, recipe: Recipe, recipeScale: number): Promise<void | RequestResponse<unknown>> {
const url = parseRecipeActionUrl(action.url, recipe); const url = parseRecipeActionUrl(action.url, recipe, recipeScale);
switch (action.actionType) { switch (action.actionType) {
case "link": case "link":

View File

@@ -349,7 +349,7 @@
"note-only": "Pouze poznámka", "note-only": "Pouze poznámka",
"random-meal": "Náhodné jídlo", "random-meal": "Náhodné jídlo",
"random-dinner": "Náhodná večeře", "random-dinner": "Náhodná večeře",
"random-side": "Random Side", "random-side": "Náhodná příloha",
"this-rule-will-apply": "Toto pravidlo se použije {dayCriteria} {mealTypeCriteria}.", "this-rule-will-apply": "Toto pravidlo se použije {dayCriteria} {mealTypeCriteria}.",
"to-all-days": "na všechny dny", "to-all-days": "na všechny dny",
"on-days": "on {0}s", "on-days": "on {0}s",
@@ -1059,14 +1059,14 @@
"food-label": "Označení jídla", "food-label": "Označení jídla",
"edit-food": "Upravit jídlo", "edit-food": "Upravit jídlo",
"food-data": "Data jídla", "food-data": "Data jídla",
"example-food-singular": "ex: Onion", "example-food-singular": "např.: Brambora",
"example-food-plural": "ex: Onions", "example-food-plural": "např.: Brambory",
"label-overwrite-warning": "Toto přiřadí vybraný štítek všem vybraným jídlům a může přepsat stávající štítky.", "label-overwrite-warning": "Toto přiřadí vybraný štítek všem vybraným jídlům a může přepsat stávající štítky.",
"on-hand-checkbox-label": "Nastavením tohoto příznaku bude tato potravina při přidávání receptu do nákupního seznamu ve výchozím nastavení odškrtnuta." "on-hand-checkbox-label": "Nastavením tohoto příznaku bude tato potravina při přidávání receptu do nákupního seznamu ve výchozím nastavení odškrtnuta."
}, },
"units": { "units": {
"seed-dialog-text": "Naplnit databázi s běžnými jednotkami používanými ve vašem jazyce.", "seed-dialog-text": "Naplnit databázi s běžnými jednotkami používanými ve vašem jazyce.",
"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-description": "Zkombinování zvolených jednotek spojí zdrojovou a cílovou jednotku do jedné. {source-unit-will-be-deleted} a všechny odkazy na ni budou upraveny na cílovou jednotku.",
"combine-unit": "Kombinovaná jednotka", "combine-unit": "Kombinovaná jednotka",
"source-unit": "Zdrojová jednotka", "source-unit": "Zdrojová jednotka",
"target-unit": "Cílová jednotka", "target-unit": "Cílová jednotka",
@@ -1081,10 +1081,10 @@
"unit-data": "Data jednotky", "unit-data": "Data jednotky",
"use-abbv": "Používat zkratky", "use-abbv": "Používat zkratky",
"fraction": "Zlomek", "fraction": "Zlomek",
"example-unit-singular": "ex: Tablespoon", "example-unit-singular": "např.: Čajová lžička",
"example-unit-plural": "ex: Tablespoons", "example-unit-plural": "např.: Čajové lžičky",
"example-unit-abbreviation-singular": "ex: Tbsp", "example-unit-abbreviation-singular": "např.: čl",
"example-unit-abbreviation-plural": "ex: Tbsps" "example-unit-abbreviation-plural": "např.: čl"
}, },
"labels": { "labels": {
"seed-dialog-text": "Naplnit databázi s běžnými popisky používanými ve vašem jazyce.", "seed-dialog-text": "Naplnit databázi s běžnými popisky používanými ve vašem jazyce.",
@@ -1296,7 +1296,7 @@
"profile": { "profile": {
"welcome-user": "👋 Vítejte, {0}!", "welcome-user": "👋 Vítejte, {0}!",
"description": "Spravujte svůj profil, recepty a nastavení skupiny.", "description": "Spravujte svůj profil, recepty a nastavení skupiny.",
"invite-link": "Invite Link", "invite-link": "Odkaz pozvánky",
"get-invite-link": "Získat odkaz na pozvánku", "get-invite-link": "Získat odkaz na pozvánku",
"get-public-link": "Získat veřejný odkaz", "get-public-link": "Získat veřejný odkaz",
"account-summary": "Přehled účtu", "account-summary": "Přehled účtu",
@@ -1346,7 +1346,7 @@
"cookbook": { "cookbook": {
"cookbooks": "Kuchařky", "cookbooks": "Kuchařky",
"description": "Kuchařky jsou dalším způsobem, jak uspořádat recepty vytvořením průřezů receptů, organizátorů a dalších filtrů. Vytvořením kuchařky se přidá položka na postranní panel a v kuchařce se zobrazí všechny recepty s vybranými filtry.", "description": "Kuchařky jsou dalším způsobem, jak uspořádat recepty vytvořením průřezů receptů, organizátorů a dalších filtrů. Vytvořením kuchařky se přidá položka na postranní panel a v kuchařce se zobrazí všechny recepty s vybranými filtry.",
"hide-cookbooks-from-other-households": "Hide Cookbooks from Other Households", "hide-cookbooks-from-other-households": "Skrýt kuchařky ostatních domácností",
"hide-cookbooks-from-other-households-description": "Pokud je povoleno, objeví se na postranním panelu pouze kuchařské knihy z vaší domácnosti", "hide-cookbooks-from-other-households-description": "Pokud je povoleno, objeví se na postranním panelu pouze kuchařské knihy z vaší domácnosti",
"public-cookbook": "Veřejná kuchařka", "public-cookbook": "Veřejná kuchařka",
"public-cookbook-description": "Veřejné kuchařky mohou být sdíleny s neregistrovanými uživateli a budou zobrazeny na stránce vaší skupiny.", "public-cookbook-description": "Veřejné kuchařky mohou být sdíleny s neregistrovanými uživateli a budou zobrazeny na stránce vaší skupiny.",

View File

@@ -174,7 +174,7 @@
"wednesday": "Τετάρτη", "wednesday": "Τετάρτη",
"yes": "Ναι", "yes": "Ναι",
"foods": "Τρόφιμα", "foods": "Τρόφιμα",
"units": "Μονάδες", "units": "Μονάδες μέτρησης",
"back": "Πίσω", "back": "Πίσω",
"next": "Επόμενο", "next": "Επόμενο",
"start": "Εναρξη", "start": "Εναρξη",

View File

@@ -469,7 +469,7 @@
"categories": "Categorías", "categories": "Categorías",
"cholesterol-content": "Colesterol", "cholesterol-content": "Colesterol",
"comment-action": "Comentar", "comment-action": "Comentar",
"comment": "Comentar", "comment": "Comentario",
"comments": "Comentarios", "comments": "Comentarios",
"delete-confirmation": "¿Estás seguro de eliminar esta receta?", "delete-confirmation": "¿Estás seguro de eliminar esta receta?",
"delete-recipe": "Borrar receta", "delete-recipe": "Borrar receta",

View File

@@ -23,7 +23,7 @@
"support": "Tuki", "support": "Tuki",
"version": "Versio", "version": "Versio",
"unknown-version": "tuntematon", "unknown-version": "tuntematon",
"sponsor": "Yhteistyökumppani" "sponsor": "Sponsori"
}, },
"asset": { "asset": {
"assets": "Liitteet", "assets": "Liitteet",
@@ -72,7 +72,7 @@
"enable-notifier": "Ota ilmoittaja käyttöön", "enable-notifier": "Ota ilmoittaja käyttöön",
"what-events": "Mistä tapahtumista tulisi ilmoittaa?", "what-events": "Mistä tapahtumista tulisi ilmoittaa?",
"user-events": "Käyttäjän tapahtumat", "user-events": "Käyttäjän tapahtumat",
"mealplan-events": "Ateriasuunnittelun tapahtumat", "mealplan-events": "Ateriasuunnitelman Tapahtumat",
"when-a-user-in-your-group-creates-a-new-mealplan": "Kun ryhmäsi käyttäjä tekee ateriasuunnitelman", "when-a-user-in-your-group-creates-a-new-mealplan": "Kun ryhmäsi käyttäjä tekee ateriasuunnitelman",
"shopping-list-events": "Ostoslistatapahtumat", "shopping-list-events": "Ostoslistatapahtumat",
"cookbook-events": "Keittokirjatapahtumat", "cookbook-events": "Keittokirjatapahtumat",
@@ -277,7 +277,7 @@
"admin-group-management-text": "Muutokset tähän ryhmään tulevat näkymään välittömästi.", "admin-group-management-text": "Muutokset tähän ryhmään tulevat näkymään välittömästi.",
"group-id-value": "Ryhmän tunniste: {0}", "group-id-value": "Ryhmän tunniste: {0}",
"total-households": "Kotitaloudet Yhteensä", "total-households": "Kotitaloudet Yhteensä",
"you-must-select-a-group-before-selecting-a-household": "You must select a group before selecting a household" "you-must-select-a-group-before-selecting-a-household": "Sinun tulee valita ryhmä ennen kuin valitset kotitalouden"
}, },
"household": { "household": {
"household": "Kotitalous", "household": "Kotitalous",
@@ -518,7 +518,7 @@
"save-recipe-before-use": "Tallenna resepti ennen käyttöä", "save-recipe-before-use": "Tallenna resepti ennen käyttöä",
"section-title": "Osion otsikko", "section-title": "Osion otsikko",
"servings": "Annokset", "servings": "Annokset",
"serves-amount": "Serves {amount}", "serves-amount": "{amount} annosta",
"share-recipe-message": "Halusin jakaa reseptin {0} kanssasi.", "share-recipe-message": "Halusin jakaa reseptin {0} kanssasi.",
"show-nutrition-values": "Näytä ravintoarvot", "show-nutrition-values": "Näytä ravintoarvot",
"sodium-content": "Natrium", "sodium-content": "Natrium",
@@ -532,7 +532,7 @@
"no-recipe": "Ei reseptiä", "no-recipe": "Ei reseptiä",
"locked-by-owner": "Omistajan lukitsema", "locked-by-owner": "Omistajan lukitsema",
"join-the-conversation": "Liity keskusteluun", "join-the-conversation": "Liity keskusteluun",
"add-recipe-to-mealplan": "Lisää resepti ateriasuunnitelmaan", "add-recipe-to-mealplan": "Lisää resepti Ateriasuunnitelmaan",
"entry-type": "Merkinnän tyyppi", "entry-type": "Merkinnän tyyppi",
"date-format-hint": "KK/PP/VVVV-muoto", "date-format-hint": "KK/PP/VVVV-muoto",
"date-format-hint-yyyy-mm-dd": "VVVV-KK-PP-muoto", "date-format-hint-yyyy-mm-dd": "VVVV-KK-PP-muoto",
@@ -546,9 +546,9 @@
"failed-to-add-recipes-to-list": "Luetteloon lisääminen epäonnistui", "failed-to-add-recipes-to-list": "Luetteloon lisääminen epäonnistui",
"failed-to-add-recipe-to-mealplan": "Reseptiä ei voitu lisätä ateriasuunnitelmaan", "failed-to-add-recipe-to-mealplan": "Reseptiä ei voitu lisätä ateriasuunnitelmaan",
"failed-to-add-to-list": "Luetteloon lisääminen epäonnistui", "failed-to-add-to-list": "Luetteloon lisääminen epäonnistui",
"yield": "Sato", "yield": "Tuotto",
"yields-amount-with-text": "Yields {amount} {text}", "yields-amount-with-text": "Tuottaa {amount} {text}",
"yield-text": "Yield Text", "yield-text": "Tuotosteksti",
"quantity": "Määrä", "quantity": "Määrä",
"choose-unit": "Valitse Yksikkö", "choose-unit": "Valitse Yksikkö",
"press-enter-to-create": "Luo painamalla Enter", "press-enter-to-create": "Luo painamalla Enter",
@@ -637,9 +637,9 @@
"recipe-debugger-use-openai-description": "Käytä OpenAI:ta kaavinkirjaston sijaan tulosten jäsentämiseen. Luodessa reseptiä URL:n kautta tämä tehdään ilman eri kysymystä, kun kaavinkirjasto ei toimi, mutta voit kokeilla sitä tässä manuaalisesti.", "recipe-debugger-use-openai-description": "Käytä OpenAI:ta kaavinkirjaston sijaan tulosten jäsentämiseen. Luodessa reseptiä URL:n kautta tämä tehdään ilman eri kysymystä, kun kaavinkirjasto ei toimi, mutta voit kokeilla sitä tässä manuaalisesti.",
"debug": "Vianhaku", "debug": "Vianhaku",
"tree-view": "Puunäkymä", "tree-view": "Puunäkymä",
"recipe-servings": "Recipe Servings", "recipe-servings": "Reseptin annokset",
"recipe-yield": "Reseptin tekijä", "recipe-yield": "Reseptin tuotto",
"recipe-yield-text": "Recipe Yield Text", "recipe-yield-text": "Reseptin tuotosteksti",
"unit": "Yksikkö", "unit": "Yksikkö",
"upload-image": "Lataa kuva", "upload-image": "Lataa kuva",
"screen-awake": "Pidä näyttö aina päällä", "screen-awake": "Pidä näyttö aina päällä",
@@ -661,25 +661,25 @@
"missing-food": "Luo puuttuva ruoka: {food}", "missing-food": "Luo puuttuva ruoka: {food}",
"no-food": "Ei ruokaa" "no-food": "Ei ruokaa"
}, },
"reset-servings-count": "Reset Servings Count", "reset-servings-count": "Palauta Annoksien Määrä",
"not-linked-ingredients": "Additional Ingredients" "not-linked-ingredients": "Muut ainesosat"
}, },
"recipe-finder": { "recipe-finder": {
"recipe-finder": "Recipe Finder", "recipe-finder": "Reseptin etsijä",
"recipe-finder-description": "Search for recipes based on ingredients you have on hand. You can also filter by tools you have available, and set a maximum number of missing ingredients or tools.", "recipe-finder-description": "Etsi sopivia reseptejä saatavilla olevien ainesosien perusteella. Voit myös suodattaa tulokset saatavilla olevien ruoanvalmistusvälineiden perusteella, ja asettaa enimmäismäärän puuttuvia ainesosia tai välineitä.",
"selected-ingredients": "Selected Ingredients", "selected-ingredients": "Valitut ainesosat",
"no-ingredients-selected": "No ingredients selected", "no-ingredients-selected": "Ei valittuja ainesosia",
"missing": "Missing", "missing": "Puuttuu",
"no-recipes-found": "No recipes found", "no-recipes-found": "Reseptejä ei löytynyt",
"no-recipes-found-description": "Try adding more ingredients to your search or adjusting your filters", "no-recipes-found-description": "Kokeile lisätä enemmän ainesosia hakuun tai säätää suodattimia",
"include-ingredients-on-hand": "Include Ingredients On Hand", "include-ingredients-on-hand": "Sisällytä saatavilla olevat ainesosat",
"include-tools-on-hand": "Include Tools On Hand", "include-tools-on-hand": "Sisällytä saatavilla olevat välineet",
"max-missing-ingredients": "Max Missing Ingredients", "max-missing-ingredients": "Puuttuvien ainesten enimmäismäärä",
"max-missing-tools": "Max Missing Tools", "max-missing-tools": "Puuttuvien välineiden enimmäismäärä",
"selected-tools": "Selected Tools", "selected-tools": "Valitut välineet",
"other-filters": "Other Filters", "other-filters": "Muut suodattimet",
"ready-to-make": "Ready to Make", "ready-to-make": "Valmis tekemään",
"almost-ready-to-make": "Almost Ready to Make" "almost-ready-to-make": "Melkein valmis tekemään"
}, },
"search": { "search": {
"advanced-search": "Tarkennettu haku", "advanced-search": "Tarkennettu haku",
@@ -690,7 +690,7 @@
"or": "Tai", "or": "Tai",
"has-any": "On Mikä Tahansa", "has-any": "On Mikä Tahansa",
"has-all": "On Kaikki", "has-all": "On Kaikki",
"clear-selection": "Clear Selection", "clear-selection": "Tyhjennä valinnat",
"results": "Tulokset", "results": "Tulokset",
"search": "Hae", "search": "Hae",
"search-mealie": "Hae Mealiestä (paina /)", "search-mealie": "Hae Mealiestä (paina /)",
@@ -884,7 +884,7 @@
"are-you-sure-you-want-to-check-all-items": "Haluatko varmasti valita kaikki kohteet?", "are-you-sure-you-want-to-check-all-items": "Haluatko varmasti valita kaikki kohteet?",
"are-you-sure-you-want-to-uncheck-all-items": "Haluatko varmasti poistaa kaikki valinnat?", "are-you-sure-you-want-to-uncheck-all-items": "Haluatko varmasti poistaa kaikki valinnat?",
"are-you-sure-you-want-to-delete-checked-items": "Haluatko varmasti poistaa kaikki valitut kohteet?", "are-you-sure-you-want-to-delete-checked-items": "Haluatko varmasti poistaa kaikki valitut kohteet?",
"no-shopping-lists-found": "No Shopping Lists Found" "no-shopping-lists-found": "Ostoslistoja ei löytynyt"
}, },
"sidebar": { "sidebar": {
"all-recipes": "Reseptit", "all-recipes": "Reseptit",
@@ -981,7 +981,7 @@
"register": "Rekisteröidy", "register": "Rekisteröidy",
"reset-password": "Palauta salasana", "reset-password": "Palauta salasana",
"sign-in": "Kirjaudu", "sign-in": "Kirjaudu",
"total-mealplans": "Ateriasuunnitelmia", "total-mealplans": "Ateriasuunnitelma Yhteensä",
"total-users": "Käyttäjien määrä", "total-users": "Käyttäjien määrä",
"upload-photo": "Tuo kuva", "upload-photo": "Tuo kuva",
"use-8-characters-or-more-for-your-password": "Salasanan pituuden on oltava vähintään kahdeksan merkkiä", "use-8-characters-or-more-for-your-password": "Salasanan pituuden on oltava vähintään kahdeksan merkkiä",
@@ -1030,7 +1030,7 @@
"administrator": "Ylläpitäjä", "administrator": "Ylläpitäjä",
"user-can-invite-other-to-group": "Käyttäjä voi kutsua muita ryhmään", "user-can-invite-other-to-group": "Käyttäjä voi kutsua muita ryhmään",
"user-can-manage-group": "Käyttäjä voi hallita ryhmää", "user-can-manage-group": "Käyttäjä voi hallita ryhmää",
"user-can-manage-household": "User can manage household", "user-can-manage-household": "Käyttäjä voi hallita kotitaloutta",
"user-can-organize-group-data": "Käyttäjä voi järjestellä ryhmän tietoja", "user-can-organize-group-data": "Käyttäjä voi järjestellä ryhmän tietoja",
"enable-advanced-features": "Salli edistyneemmät ominaisuudet", "enable-advanced-features": "Salli edistyneemmät ominaisuudet",
"it-looks-like-this-is-your-first-time-logging-in": "Tämä vaikuttaa olevan ensimmäinen kirjautumisesi.", "it-looks-like-this-is-your-first-time-logging-in": "Tämä vaikuttaa olevan ensimmäinen kirjautumisesi.",
@@ -1213,7 +1213,7 @@
"result": "Valittu teksti tulee näkymään aiemmin valitun kentän sisällä." "result": "Valittu teksti tulee näkymään aiemmin valitun kentän sisällä."
}, },
"pan-and-zoom-mode": "Kääntö- ja zoomaustila", "pan-and-zoom-mode": "Kääntö- ja zoomaustila",
"pan-and-zoom-desc": "Select pan and zoom by clicking the icon. This mode allows to zoom inside the image and move around to make using big images easier.", "pan-and-zoom-desc": "Valitse panorointi ja zoomaus klikkaamalla kuvaketta. Tämä tila mahdollistaa zoomauksen kuvan sisällä ja liikkumisen niin, että isojen kuvien käyttö on helpompaa.",
"split-text-mode": "Jaa tekstitila", "split-text-mode": "Jaa tekstitila",
"split-modes": { "split-modes": {
"line-mode": "Rivitila (oletus)", "line-mode": "Rivitila (oletus)",
@@ -1232,37 +1232,37 @@
"summary-title": "Yhteenveto", "summary-title": "Yhteenveto",
"button-label-get-summary": "Hae Yhteenveto", "button-label-get-summary": "Hae Yhteenveto",
"button-label-open-details": "Tiedot", "button-label-open-details": "Tiedot",
"info-description-data-dir-size": "Datahakemiston Koko", "info-description-data-dir-size": "Datahakemiston koko",
"info-description-log-file-size": "Lokitiedoston Koko", "info-description-log-file-size": "Lokitiedoston Koko",
"info-description-cleanable-directories": "Siivottavat Hakemistot", "info-description-cleanable-directories": "Siivottavat hakemistot",
"info-description-cleanable-images": "Siivottavat Kuvat", "info-description-cleanable-images": "Siivottavat kuvat",
"storage": { "storage": {
"title-temporary-directory": "Väliaikainen Hakemisto (.temp)", "title-temporary-directory": "Väliaikainen hakemisto (.temp)",
"title-backups-directory": "Varmuuskopiointihakemisto (varmuuskopiot)", "title-backups-directory": "Varmuuskopiointihakemisto (varmuuskopiot)",
"title-groups-directory": "Ryhmien Hakemisto (ryhmät)", "title-groups-directory": "Ryhmien hakemisto (ryhmät)",
"title-recipes-directory": "Reseptihakemisto (reseptit)", "title-recipes-directory": "Reseptihakemisto (reseptit)",
"title-user-directory": "Käyttäjähakemisto (käyttäjä)" "title-user-directory": "Käyttäjähakemisto (käyttäjä)"
}, },
"action-delete-log-files-name": "Poista Lokitiedostot", "action-delete-log-files-name": "Poista Lokitiedostot",
"action-delete-log-files-description": "Poistaa kaikki lokitiedostot", "action-delete-log-files-description": "Poistaa kaikki lokitiedostot",
"action-clean-directories-name": "Puhdista Hakemistot", "action-clean-directories-name": "Puhdista hakemistot",
"action-clean-directories-description": "Poistaa kaikki reseptikansiot, jotka eivät ole kelvollisia UUID-koodeja", "action-clean-directories-description": "Poistaa kaikki reseptikansiot, jotka eivät ole kelvollisia UUID-koodeja",
"action-clean-temporary-files-name": "Poista väliaikaiset tiedostot", "action-clean-temporary-files-name": "Poista väliaikaiset tiedostot",
"action-clean-temporary-files-description": "Poistaa kaikki tiedostot ja kansiot .temp kansiosta", "action-clean-temporary-files-description": "Poistaa kaikki tiedostot ja kansiot .temp kansiosta",
"action-clean-images-name": "Puhdista Kuvat", "action-clean-images-name": "Puhdista kuvat",
"action-clean-images-description": "Poistaa kaikki kuvat, jotka eivät pääty .webp", "action-clean-images-description": "Poistaa kaikki kuvat, jotka eivät pääty .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": "Huoltotoimenpiteet ovat {destructive_in_bold} ja niitä tulisi käyttää varoen. Kaikkien näiden toimenpiteiden suorittaminen on {irreversible_in_bold}.",
"actions-description-destructive": "lopullinen", "actions-description-destructive": "tuhoisia",
"actions-description-irreversible": "peruuttamaton", "actions-description-irreversible": "peruuttamatonta",
"logs-action-refresh": "Päivitä lokit", "logs-action-refresh": "Päivitä lokit",
"logs-page-title": "Mealie- Lokit", "logs-page-title": "Mealie- Lokit",
"logs-tail-lines-label": "Tail Lines" "logs-tail-lines-label": "Loppurivit"
}, },
"mainentance": { "mainentance": {
"actions-title": "Toiminnot" "actions-title": "Toiminnot"
}, },
"ingredients-natural-language-processor": "Ingredients Natural Language Processor", "ingredients-natural-language-processor": "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 käyttää Conditional Random Fields (CRF) ainesosien jäsentämiseen ja prosessointiin. Ainesosien osalta käytetty malli perustuu yli 100000 ainesosan aineistoon New York Timesin kokoamasta aineistosta. Huomaa, että koska malli on koulutettu vain englanniksi, mallilla voi olla vaihtelevia tuloksia, kun käytät mallia muilla kielillä. Tämä sivu on mallin testaamiseen tarkoitettu leikkipaikka.",
"ingredients-natural-language-processor-explanation-2": "Se ei ole täydellinen, mutta se tuottaa hyviä tuloksia yleensä ja on hyvä lähtökohta manuaalisesti jäsentää ainesosia yksittäisiin kenttiin. Vaihtoehtoisesti voit myös käyttää Brute-prosessori, joka käyttää kuvion täsmäystekniikkaa tunnistamaan ainesosia.", "ingredients-natural-language-processor-explanation-2": "Se ei ole täydellinen, mutta se tuottaa hyviä tuloksia yleensä ja on hyvä lähtökohta manuaalisesti jäsentää ainesosia yksittäisiin kenttiin. Vaihtoehtoisesti voit myös käyttää Brute-prosessori, joka käyttää kuvion täsmäystekniikkaa tunnistamaan ainesosia.",
"nlp": "NLP", "nlp": "NLP",
"brute": "Brute", "brute": "Brute",
@@ -1279,24 +1279,24 @@
"setup": { "setup": {
"first-time-setup": "Ensiasetukset", "first-time-setup": "Ensiasetukset",
"welcome-to-mealie-get-started": "Tervetuloa Mealieen! Aloitetaan", "welcome-to-mealie-get-started": "Tervetuloa Mealieen! Aloitetaan",
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage", "already-set-up-bring-to-homepage": "Olen jo valmis, vie minut kotisivulle",
"common-settings-for-new-sites": "Here are some common settings for new sites", "common-settings-for-new-sites": "Tässä muutamia yleisiä asetuksia uusille sivustoille",
"setup-complete": "Setup Complete!", "setup-complete": "Asennus valmis.",
"here-are-a-few-things-to-help-you-get-started": "Näillä muutamilla asioilla pääset alkuun", "here-are-a-few-things-to-help-you-get-started": "Näillä muutamilla asioilla pääset alkuun",
"restore-from-v1-backup": "Onko sinulla varmuuskopio aiemmasta Mealie v1 -instanssista? Palauta se tästä.", "restore-from-v1-backup": "Onko sinulla varmuuskopio aiemmasta Mealie v1 -instanssista? Palauta se tästä.",
"manage-profile-or-get-invite-link": "Hallitse profiiliasi tai hanki kutsulinkki muille." "manage-profile-or-get-invite-link": "Hallitse profiiliasi tai hanki kutsulinkki muille."
}, },
"debug-openai-services": "Debug OpenAI Services", "debug-openai-services": "Debuggaa OpenAI-palveluita",
"debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", "debug-openai-services-description": "Käytä tätä sivua OpenAI-palveluiden debuggaamiseen. Voit testata OpenAI-yhteytesi ja nähdä tulokset täällä. Jos kuvapalvelut ovat käytössä, voit myös antaa kuvan.",
"run-test": "Run Test", "run-test": "Suorita testi",
"test-results": "Test Results", "test-results": "Testitulokset",
"group-delete-note": "Groups with users or households cannot be deleted", "group-delete-note": "Ryhmiä, joilla on käyttäjiä tai kotitalouksia, ei voi poistaa",
"household-delete-note": "Households with users cannot be deleted" "household-delete-note": "Kotitalouksia, joissa on käyttäjiä, ei voi poistaa"
}, },
"profile": { "profile": {
"welcome-user": "👋 Tervetuloa, {0}!", "welcome-user": "👋 Tervetuloa, {0}!",
"description": "Hallitse profiiliasi, reseptejäsi ja ryhmäasetuksiasi.", "description": "Hallitse profiiliasi, reseptejäsi ja ryhmäasetuksiasi.",
"invite-link": "Invite Link", "invite-link": "",
"get-invite-link": "Hanki Kutsulinkki", "get-invite-link": "Hanki Kutsulinkki",
"get-public-link": "Julkinen linkki", "get-public-link": "Julkinen linkki",
"account-summary": "Tilin Yhteenveto", "account-summary": "Tilin Yhteenveto",
@@ -1345,9 +1345,9 @@
}, },
"cookbook": { "cookbook": {
"cookbooks": "Keittokirjat", "cookbooks": "Keittokirjat",
"description": "Cookbooks are another way to organize recipes by creating cross sections of recipes, organizers, and other filters. Creating a cookbook will add an entry to the side-bar and all the recipes with the filters chosen will be displayed in the cookbook.", "description": "Keittokirjat ovat toinen tapa järjestää reseptejä luomalla poikkileikkauksia resepteistä, järjestäjistä, sekä muista suodattimista. Keittokirjan luominen lisää merkinnän sivupalkkiin, ja kaikki reseptit näkyvät keittokirjassa valittujen suodatinten mukaisesti.",
"hide-cookbooks-from-other-households": "Hide Cookbooks from Other Households", "hide-cookbooks-from-other-households": "Piilota keittokirjat muista kotitalouksista",
"hide-cookbooks-from-other-households-description": "When enabled, only cookbooks from your household will appear on the sidebar", "hide-cookbooks-from-other-households-description": "Kun käytössä, sivupalkissa näkyy vain oman kotitaloutesi keittokirjoja",
"public-cookbook": "Julkinen Keittokirja", "public-cookbook": "Julkinen Keittokirja",
"public-cookbook-description": "Julkisia keittokirjoja voidaan jakaa ei-Mealien käyttäjille, ja ne näkyvät ryhmäsi sivulla.", "public-cookbook-description": "Julkisia keittokirjoja voidaan jakaa ei-Mealien käyttäjille, ja ne näkyvät ryhmäsi sivulla.",
"filter-options": "Suodatuksen asetukset", "filter-options": "Suodatuksen asetukset",
@@ -1363,25 +1363,25 @@
}, },
"query-filter": { "query-filter": {
"logical-operators": { "logical-operators": {
"and": "AND", "and": "JA",
"or": "OR" "or": "TAI"
}, },
"relational-operators": { "relational-operators": {
"equals": "equals", "equals": "on yhtä kuin",
"does-not-equal": "does not equal", "does-not-equal": "ei ole yhtä kuin",
"is-greater-than": "is greater than", "is-greater-than": "on suurempi kuin",
"is-greater-than-or-equal-to": "is greater than or equal to", "is-greater-than-or-equal-to": "on suurempi tai yhtäsuuri kuin",
"is-less-than": "is less than", "is-less-than": "on vähemmän kuin",
"is-less-than-or-equal-to": "is less than or equal to" "is-less-than-or-equal-to": "on vähemmän tai yhtäsuuri kuin"
}, },
"relational-keywords": { "relational-keywords": {
"is": "is", "is": "on",
"is-not": "is not", "is-not": "ei ole",
"is-one-of": "is one of", "is-one-of": "on yksi näistä",
"is-not-one-of": "is not one of", "is-not-one-of": "ei ole yksi näistä",
"contains-all-of": "contains all of", "contains-all-of": "sisältää kaikki nämä",
"is-like": "is like", "is-like": "on kuin",
"is-not-like": "is not like" "is-not-like": "ei ole kuin"
} }
} }
} }

View File

@@ -517,7 +517,7 @@
"saturated-fat-content": "Grassi saturi", "saturated-fat-content": "Grassi saturi",
"save-recipe-before-use": "Salva la ricetta prima dell'uso", "save-recipe-before-use": "Salva la ricetta prima dell'uso",
"section-title": "Titolo Sezione", "section-title": "Titolo Sezione",
"servings": "Portate", "servings": "Porzioni",
"serves-amount": "Porzioni {amount}", "serves-amount": "Porzioni {amount}",
"share-recipe-message": "Volevo condividere la mia {0} ricetta con te.", "share-recipe-message": "Volevo condividere la mia {0} ricetta con te.",
"show-nutrition-values": "Mostra Valori Nutrizionali", "show-nutrition-values": "Mostra Valori Nutrizionali",
@@ -546,9 +546,9 @@
"failed-to-add-recipes-to-list": "Impossibile aggiungere la ricetta alla lista", "failed-to-add-recipes-to-list": "Impossibile aggiungere la ricetta alla lista",
"failed-to-add-recipe-to-mealplan": "Impossibile aggiungere la ricetta al piano alimentare", "failed-to-add-recipe-to-mealplan": "Impossibile aggiungere la ricetta al piano alimentare",
"failed-to-add-to-list": "Errore durante l'aggiunta alla lista", "failed-to-add-to-list": "Errore durante l'aggiunta alla lista",
"yield": "Porzioni", "yield": "Quantità prodotta",
"yields-amount-with-text": "Rendimenti {amount} {text}", "yields-amount-with-text": "Quantità prodotta: {amount} {text}",
"yield-text": "Testo di rendimento", "yield-text": "Unità della quantità prodotta",
"quantity": "Quantità", "quantity": "Quantità",
"choose-unit": "Scegli Unità", "choose-unit": "Scegli Unità",
"press-enter-to-create": "Premi invio per creare", "press-enter-to-create": "Premi invio per creare",

View File

@@ -121,7 +121,7 @@
"loading": "Kraunasi", "loading": "Kraunasi",
"loading-events": "Užkrovimo įvykiai", "loading-events": "Užkrovimo įvykiai",
"loading-recipe": "Receptai kraunasi...", "loading-recipe": "Receptai kraunasi...",
"loading-ocr-data": "Loading OCR data...", "loading-ocr-data": "Įkeliami OCR duomenys...",
"loading-recipes": "Receptai kraunasi", "loading-recipes": "Receptai kraunasi",
"message": "Pranešimas", "message": "Pranešimas",
"monday": "Pirmadienis", "monday": "Pirmadienis",
@@ -210,14 +210,14 @@
"upload-file": "Įkelti failą", "upload-file": "Įkelti failą",
"created-on-date": "Sukurta: {0}", "created-on-date": "Sukurta: {0}",
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.", "unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
"clipboard-copy-failure": "Failed to copy to the clipboard.", "clipboard-copy-failure": "Nepavyko nukopijuoti į iškarpinę.",
"confirm-delete-generic-items": "Are you sure you want to delete the following items?", "confirm-delete-generic-items": "Are you sure you want to delete the following items?",
"organizers": "Organizers", "organizers": "Organizers",
"caution": "Caution", "caution": "Caution",
"show-advanced": "Show Advanced", "show-advanced": "Rodyti plačiau",
"add-field": "Add Field", "add-field": "Pridėti lauką",
"date-created": "Date Created", "date-created": "Sukūrimo data",
"date-updated": "Date Updated" "date-updated": "Atnaujinimo data"
}, },
"group": { "group": {
"are-you-sure-you-want-to-delete-the-group": "Ar tikrai norite ištrinti <b>{groupName}<b/>?", "are-you-sure-you-want-to-delete-the-group": "Ar tikrai norite ištrinti <b>{groupName}<b/>?",
@@ -322,7 +322,7 @@
"mealplan-update-failed": "Mitybos plano atnaujinti nepavyko", "mealplan-update-failed": "Mitybos plano atnaujinti nepavyko",
"mealplan-updated": "Mitybos planas atnaujintas", "mealplan-updated": "Mitybos planas atnaujintas",
"mealplan-households-description": "If no household is selected, recipes can be added from any household", "mealplan-households-description": "If no household is selected, recipes can be added from any household",
"any-category": "Any Category", "any-category": "Bet kuri kategorija",
"any-tag": "Any Tag", "any-tag": "Any Tag",
"any-household": "Any Household", "any-household": "Any Household",
"no-meal-plan-defined-yet": "Nėra nustatytų mitybos planų", "no-meal-plan-defined-yet": "Nėra nustatytų mitybos planų",

View File

@@ -8,7 +8,7 @@
"database-type": "Tipo do Banco de Dados", "database-type": "Tipo do Banco de Dados",
"database-url": "URL do banco de dados", "database-url": "URL do banco de dados",
"default-group": "Grupo Padrão", "default-group": "Grupo Padrão",
"default-household": "Default Household", "default-household": "Casa Padrão",
"demo": "Demonstração", "demo": "Demonstração",
"demo-status": "Status da Demonstração", "demo-status": "Status da Demonstração",
"development": "Desenvolvimento", "development": "Desenvolvimento",
@@ -182,7 +182,7 @@
"date": "Data", "date": "Data",
"id": "Id", "id": "Id",
"owner": "Proprietário", "owner": "Proprietário",
"change-owner": "Change Owner", "change-owner": "Alterar Dono",
"date-added": "Data de inclusão", "date-added": "Data de inclusão",
"none": "Nenhum", "none": "Nenhum",
"run": "Executar", "run": "Executar",
@@ -214,10 +214,10 @@
"confirm-delete-generic-items": "Tem certeza que quer excluir os itens seguintes?", "confirm-delete-generic-items": "Tem certeza que quer excluir os itens seguintes?",
"organizers": "Organizadores", "organizers": "Organizadores",
"caution": "Cuidado", "caution": "Cuidado",
"show-advanced": "Show Advanced", "show-advanced": "Mostrar Avançado",
"add-field": "Add Field", "add-field": "Adicionar Campo",
"date-created": "Date Created", "date-created": "Data de Criação",
"date-updated": "Date Updated" "date-updated": "Data de Atualização"
}, },
"group": { "group": {
"are-you-sure-you-want-to-delete-the-group": "Tem certeza que deseja excluir o grupo <b>{groupName}<b/>?", "are-you-sure-you-want-to-delete-the-group": "Tem certeza que deseja excluir o grupo <b>{groupName}<b/>?",
@@ -244,9 +244,9 @@
"keep-my-recipes-private-description": "Define o seu grupo e todas as receitas padrão como privadas. Você sempre pode mudar isso mais tarde." "keep-my-recipes-private-description": "Define o seu grupo e todas as receitas padrão como privadas. Você sempre pode mudar isso mais tarde."
}, },
"manage-members": "Gerenciar membros", "manage-members": "Gerenciar membros",
"manage-members-description": "Manage the permissions of the members in your household. {manage} allows the user to access the data-management page, and {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.", "manage-members-description": "Gerencie as permissões dos membros da sua casa. {manage} permite ao usuário acessar a página de gerenciamento de dados, e {invite} permite ao usuário gerar links de convites para outros usuários. Os proprietários de grupos não podem mudar suas próprias permissões.",
"manage": "Gerenciar", "manage": "Gerenciar",
"manage-household": "Manage Household", "manage-household": "Gerenciar Casa",
"invite": "Convidar", "invite": "Convidar",
"looking-to-update-your-profile": "Procurando atualizar seu perfil?", "looking-to-update-your-profile": "Procurando atualizar seu perfil?",
"default-recipe-preferences-description": "Estas são as configurações padrão quando uma nova receita é criada no seu grupo. Elas podem ser alteradas para receitas individuais no menu de configurações de receitas.", "default-recipe-preferences-description": "Estas são as configurações padrão quando uma nova receita é criada no seu grupo. Elas podem ser alteradas para receitas individuais no menu de configurações de receitas.",
@@ -267,7 +267,7 @@
"disable-users-from-commenting-on-recipes": "Desabilitar usuários de comentar em receitas", "disable-users-from-commenting-on-recipes": "Desabilitar usuários de comentar em receitas",
"disable-users-from-commenting-on-recipes-description": "Oculta a seção de comentários na página de receita e desativa os comentários", "disable-users-from-commenting-on-recipes-description": "Oculta a seção de comentários na página de receita e desativa os comentários",
"disable-organizing-recipe-ingredients-by-units-and-food": "Desativar a organização de ingredientes de receita por unidades e alimentos", "disable-organizing-recipe-ingredients-by-units-and-food": "Desativar a organização de ingredientes de receita por unidades e alimentos",
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Hides the Food, Unit, and Amount fields for ingredients and treats ingredients as plain text fields", "disable-organizing-recipe-ingredients-by-units-and-food-description": "Oculta os campos Comida, Unidade e Quantidade de ingredientes e trata os ingredientes como campos de texto simples",
"general-preferences": "Preferências Gerais", "general-preferences": "Preferências Gerais",
"group-recipe-preferences": "Preferências de Grupo de Receitas", "group-recipe-preferences": "Preferências de Grupo de Receitas",
"report": "Denunciar", "report": "Denunciar",
@@ -280,8 +280,8 @@
"you-must-select-a-group-before-selecting-a-household": "You must select a group before selecting a household" "you-must-select-a-group-before-selecting-a-household": "You must select a group before selecting a household"
}, },
"household": { "household": {
"household": "Household", "household": "Casa",
"households": "Households", "households": "Casas",
"user-household": "User Household", "user-household": "User Household",
"create-household": "Create Household", "create-household": "Create Household",
"household-name": "Household Name", "household-name": "Household Name",
@@ -467,7 +467,7 @@
"calories-suffix": "calorias", "calories-suffix": "calorias",
"carbohydrate-content": "Carboidrato", "carbohydrate-content": "Carboidrato",
"categories": "Categorias", "categories": "Categorias",
"cholesterol-content": "Cholesterol", "cholesterol-content": "Colesterol",
"comment-action": "Comentário", "comment-action": "Comentário",
"comment": "Comentário", "comment": "Comentário",
"comments": "Comentários", "comments": "Comentários",
@@ -514,11 +514,11 @@
"recipe-updated": "Receita atualizada", "recipe-updated": "Receita atualizada",
"remove-from-favorites": "Remover dos Favoritos", "remove-from-favorites": "Remover dos Favoritos",
"remove-section": "Remover Seção", "remove-section": "Remover Seção",
"saturated-fat-content": "Saturated fat", "saturated-fat-content": "Gorduras saturadas",
"save-recipe-before-use": "Salve a receita antes de utilizar", "save-recipe-before-use": "Salve a receita antes de utilizar",
"section-title": "Título da Seção", "section-title": "Título da Seção",
"servings": "Porções", "servings": "Porções",
"serves-amount": "Serves {amount}", "serves-amount": "Serve {amount}",
"share-recipe-message": "Eu quero compartilhar minha receita de {0} com você.", "share-recipe-message": "Eu quero compartilhar minha receita de {0} com você.",
"show-nutrition-values": "Mostrar informações nutricionais", "show-nutrition-values": "Mostrar informações nutricionais",
"sodium-content": "Sódio", "sodium-content": "Sódio",
@@ -528,7 +528,7 @@
"total-time": "Tempo Total", "total-time": "Tempo Total",
"trans-fat-content": "Trans-fat", "trans-fat-content": "Trans-fat",
"unable-to-delete-recipe": "Não foi possível apagar a receita", "unable-to-delete-recipe": "Não foi possível apagar a receita",
"unsaturated-fat-content": "Unsaturated fat", "unsaturated-fat-content": "Gorduras não saturadas",
"no-recipe": "Nenhuma Receita", "no-recipe": "Nenhuma Receita",
"locked-by-owner": "Bloqueado pelo Proprietário", "locked-by-owner": "Bloqueado pelo Proprietário",
"join-the-conversation": "Participe da conversa", "join-the-conversation": "Participe da conversa",
@@ -600,9 +600,9 @@
"create-recipe-from-an-image": "Create Recipe from an Image", "create-recipe-from-an-image": "Create Recipe from an Image",
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.", "create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.", "crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
"create-from-image": "Create from Image", "create-from-image": "Criar a partir da imagem",
"should-translate-description": "Translate the recipe into my language", "should-translate-description": "Traduza a receita para o meu idioma",
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.", "please-wait-image-procesing": "Por favor aguarde, a imagem está sendo processada. Isto pode levar algum tempo.",
"bulk-url-import": "Importação de URL em massa", "bulk-url-import": "Importação de URL em massa",
"debug-scraper": "Debug Scraper", "debug-scraper": "Debug Scraper",
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Crie uma receita fornecendo o nome. Todas as receitas devem ter nomes exclusivos.", "create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Crie uma receita fornecendo o nome. Todas as receitas devem ter nomes exclusivos.",
@@ -611,7 +611,7 @@
"scrape-recipe-description": "Scrape uma receita por url. Forneça o Url para o site que você deseja scrape, e Mealie tentará raspar a receita desse site e adicioná-la à sua coleção.", "scrape-recipe-description": "Scrape uma receita por url. Forneça o Url para o site que você deseja scrape, e Mealie tentará raspar a receita desse site e adicioná-la à sua coleção.",
"scrape-recipe-have-a-lot-of-recipes": "Tem muitas receitas a extrair de uma vez?", "scrape-recipe-have-a-lot-of-recipes": "Tem muitas receitas a extrair de uma vez?",
"scrape-recipe-suggest-bulk-importer": "Tente o importador em massa", "scrape-recipe-suggest-bulk-importer": "Tente o importador em massa",
"scrape-recipe-have-raw-html-or-json-data": "Have raw HTML or JSON data?", "scrape-recipe-have-raw-html-or-json-data": "Tem dados HTML ou JSON brutos?",
"scrape-recipe-you-can-import-from-raw-data-directly": "You can import from raw data directly", "scrape-recipe-you-can-import-from-raw-data-directly": "You can import from raw data directly",
"import-original-keywords-as-tags": "Importar palavras-chave originais como marcadores", "import-original-keywords-as-tags": "Importar palavras-chave originais como marcadores",
"stay-in-edit-mode": "Permanecer no modo de edição", "stay-in-edit-mode": "Permanecer no modo de edição",
@@ -662,22 +662,22 @@
"no-food": "Sem Comida" "no-food": "Sem Comida"
}, },
"reset-servings-count": "Reset Servings Count", "reset-servings-count": "Reset Servings Count",
"not-linked-ingredients": "Additional Ingredients" "not-linked-ingredients": "Ingredientes adicionais"
}, },
"recipe-finder": { "recipe-finder": {
"recipe-finder": "Recipe Finder", "recipe-finder": "Localizador de Receitas",
"recipe-finder-description": "Search for recipes based on ingredients you have on hand. You can also filter by tools you have available, and set a maximum number of missing ingredients or tools.", "recipe-finder-description": "Procure por receitas baseadas em ingredientes que você tem na mão. Você também pode filtrar por ferramentas disponíveis e definir um número máximo de ingredientes ou ferramentas que faltam.",
"selected-ingredients": "Selected Ingredients", "selected-ingredients": "Ingredientes selecionados",
"no-ingredients-selected": "No ingredients selected", "no-ingredients-selected": "Nenhum ingrediente selecionado",
"missing": "Missing", "missing": "Ausente",
"no-recipes-found": "No recipes found", "no-recipes-found": "Nenhuma receita encontrada",
"no-recipes-found-description": "Try adding more ingredients to your search or adjusting your filters", "no-recipes-found-description": "Try adding more ingredients to your search or adjusting your filters",
"include-ingredients-on-hand": "Include Ingredients On Hand", "include-ingredients-on-hand": "Include Ingredients On Hand",
"include-tools-on-hand": "Include Tools On Hand", "include-tools-on-hand": "Include Tools On Hand",
"max-missing-ingredients": "Max Missing Ingredients", "max-missing-ingredients": "Max Missing Ingredients",
"max-missing-tools": "Max Missing Tools", "max-missing-tools": "Max Missing Tools",
"selected-tools": "Selected Tools", "selected-tools": "Ferramentas Selecionadas",
"other-filters": "Other Filters", "other-filters": "Outros Filtros",
"ready-to-make": "Ready to Make", "ready-to-make": "Ready to Make",
"almost-ready-to-make": "Almost Ready to Make" "almost-ready-to-make": "Almost Ready to Make"
}, },
@@ -690,7 +690,7 @@
"or": "Ou", "or": "Ou",
"has-any": "Tem alguma", "has-any": "Tem alguma",
"has-all": "Tem todos", "has-all": "Tem todos",
"clear-selection": "Clear Selection", "clear-selection": "Limpar Seleção",
"results": "Resultados", "results": "Resultados",
"search": "Pesquisar", "search": "Pesquisar",
"search-mealie": "Pesquisar no Mealie (pressione /)", "search-mealie": "Pesquisar no Mealie (pressione /)",
@@ -884,7 +884,7 @@
"are-you-sure-you-want-to-check-all-items": "Tem certeza que deseja marcar todos os itens?", "are-you-sure-you-want-to-check-all-items": "Tem certeza que deseja marcar todos os itens?",
"are-you-sure-you-want-to-uncheck-all-items": "Tem certeza que deseja desmarcar todos os itens?", "are-you-sure-you-want-to-uncheck-all-items": "Tem certeza que deseja desmarcar todos os itens?",
"are-you-sure-you-want-to-delete-checked-items": "Tem certeza que deseja apagar todos os itens marcados?", "are-you-sure-you-want-to-delete-checked-items": "Tem certeza que deseja apagar todos os itens marcados?",
"no-shopping-lists-found": "No Shopping Lists Found" "no-shopping-lists-found": "Nenhuma lista de compras encontrada"
}, },
"sidebar": { "sidebar": {
"all-recipes": "Todas as Receitas", "all-recipes": "Todas as Receitas",
@@ -1286,17 +1286,17 @@
"restore-from-v1-backup": "Tem uma cópia de segurança de uma instância anterior do Mealie v1? Você pode restaurá-la aqui.", "restore-from-v1-backup": "Tem uma cópia de segurança de uma instância anterior do Mealie v1? Você pode restaurá-la aqui.",
"manage-profile-or-get-invite-link": "Gerencie seu próprio perfil, ou pegue um link de convite para compartilhar." "manage-profile-or-get-invite-link": "Gerencie seu próprio perfil, ou pegue um link de convite para compartilhar."
}, },
"debug-openai-services": "Debug OpenAI Services", "debug-openai-services": "Debug de Serviços OpenAI",
"debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", "debug-openai-services-description": "Use esta página para depurar serviços OpenAI. Você pode testar a sua conexão OpenAI e ver os resultados aqui. Se você tiver os serviços de imagem ativados, você também pode fornecer uma imagem.",
"run-test": "Run Test", "run-test": "Executar teste",
"test-results": "Test Results", "test-results": "Resultados do teste",
"group-delete-note": "Groups with users or households cannot be deleted", "group-delete-note": "Groups with users or households cannot be deleted",
"household-delete-note": "Households with users cannot be deleted" "household-delete-note": "Households with users cannot be deleted"
}, },
"profile": { "profile": {
"welcome-user": "👋 Bem-vindo(a), {0}!", "welcome-user": "👋 Bem-vindo(a), {0}!",
"description": "Gerencie seu perfil, receitas e configurações de grupo.", "description": "Gerencie seu perfil, receitas e configurações de grupo.",
"invite-link": "Invite Link", "invite-link": "Link de convite",
"get-invite-link": "Obter link de convite", "get-invite-link": "Obter link de convite",
"get-public-link": "Obter link público", "get-public-link": "Obter link público",
"account-summary": "Resumo da conta", "account-summary": "Resumo da conta",
@@ -1367,21 +1367,21 @@
"or": "OR" "or": "OR"
}, },
"relational-operators": { "relational-operators": {
"equals": "equals", "equals": "igual a",
"does-not-equal": "does not equal", "does-not-equal": "não é igual a",
"is-greater-than": "is greater than", "is-greater-than": "é maior que",
"is-greater-than-or-equal-to": "is greater than or equal to", "is-greater-than-or-equal-to": "é maior ou igual a",
"is-less-than": "is less than", "is-less-than": "é menor que",
"is-less-than-or-equal-to": "is less than or equal to" "is-less-than-or-equal-to": "é menor ou igual a"
}, },
"relational-keywords": { "relational-keywords": {
"is": "is", "is": "é",
"is-not": "is not", "is-not": "não é",
"is-one-of": "is one of", "is-one-of": "é um(a) de",
"is-not-one-of": "is not one of", "is-not-one-of": "não é um de",
"contains-all-of": "contains all of", "contains-all-of": "contém todos de",
"is-like": "is like", "is-like": "é como",
"is-not-like": "is not like" "is-not-like": "não é como"
} }
} }
} }

View File

@@ -601,7 +601,7 @@
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.", "create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.", "crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
"create-from-image": "Create from Image", "create-from-image": "Create from Image",
"should-translate-description": "Translate the recipe into my language", "should-translate-description": "Перевести рецепт на мой язык",
"please-wait-image-procesing": "Подождите, идет обработка изображения.", "please-wait-image-procesing": "Подождите, идет обработка изображения.",
"bulk-url-import": "Массовый импорт по URL", "bulk-url-import": "Массовый импорт по URL",
"debug-scraper": "Отладка сканирования", "debug-scraper": "Отладка сканирования",
@@ -611,16 +611,16 @@
"scrape-recipe-description": "Отсканировать рецепт по ссылке. Предоставьте ссылку на страницу, которую вы хотите отсканировать, и Mealie попытается вырезать рецепт с этого сайта и добавить его в свою коллекцию.", "scrape-recipe-description": "Отсканировать рецепт по ссылке. Предоставьте ссылку на страницу, которую вы хотите отсканировать, и Mealie попытается вырезать рецепт с этого сайта и добавить его в свою коллекцию.",
"scrape-recipe-have-a-lot-of-recipes": "Хотите отсканировать несколько рецептов за раз?", "scrape-recipe-have-a-lot-of-recipes": "Хотите отсканировать несколько рецептов за раз?",
"scrape-recipe-suggest-bulk-importer": "Воспользуйтесь массовым импортом", "scrape-recipe-suggest-bulk-importer": "Воспользуйтесь массовым импортом",
"scrape-recipe-have-raw-html-or-json-data": "Have raw HTML or JSON data?", "scrape-recipe-have-raw-html-or-json-data": "У Вас есть данные HTML или JSON?",
"scrape-recipe-you-can-import-from-raw-data-directly": "You can import from raw data directly", "scrape-recipe-you-can-import-from-raw-data-directly": "You can import from raw data directly",
"import-original-keywords-as-tags": "Импортировать исходные ключевые слова как теги", "import-original-keywords-as-tags": "Импортировать исходные ключевые слова как теги",
"stay-in-edit-mode": "Остаться в режиме редактирования", "stay-in-edit-mode": "Остаться в режиме редактирования",
"import-from-zip": "Импорт из архива", "import-from-zip": "Импорт из архива",
"import-from-zip-description": "Импорт одного рецепта, который был экспортирован из другого экземпляра Mealie.", "import-from-zip-description": "Импорт одного рецепта, который был экспортирован из другого экземпляра Mealie.",
"import-from-html-or-json": "Import from HTML or JSON", "import-from-html-or-json": "Импортировать из HTML или JSON",
"import-from-html-or-json-description": "Import a single recipe from raw HTML or JSON. This is useful if you have a recipe from a site that Mealie can't scrape normally, or from some other external source.", "import-from-html-or-json-description": "Import a single recipe from raw HTML or JSON. This is useful if you have a recipe from a site that Mealie can't scrape normally, or from some other external source.",
"json-import-format-description-colon": "To import via JSON, it must be in valid format:", "json-import-format-description-colon": "To import via JSON, it must be in valid format:",
"json-editor": "JSON Editor", "json-editor": "Редактор JSON",
"zip-files-must-have-been-exported-from-mealie": ".zip файлы должны быть экспортированы из Mealie", "zip-files-must-have-been-exported-from-mealie": ".zip файлы должны быть экспортированы из Mealie",
"create-a-recipe-by-uploading-a-scan": "Создайте рецепт, загрузив скан.", "create-a-recipe-by-uploading-a-scan": "Создайте рецепт, загрузив скан.",
"upload-a-png-image-from-a-recipe-book": "Загрузить png изображение из книги рецептов", "upload-a-png-image-from-a-recipe-book": "Загрузить png изображение из книги рецептов",
@@ -661,16 +661,16 @@
"missing-food": "Create missing food: {food}", "missing-food": "Create missing food: {food}",
"no-food": "Нет еды" "no-food": "Нет еды"
}, },
"reset-servings-count": "Reset Servings Count", "reset-servings-count": "Сбросить количество порций",
"not-linked-ingredients": "Additional Ingredients" "not-linked-ingredients": "Дополнительные ингредиенты"
}, },
"recipe-finder": { "recipe-finder": {
"recipe-finder": "Recipe Finder", "recipe-finder": "Поиск рецептов",
"recipe-finder-description": "Search for recipes based on ingredients you have on hand. You can also filter by tools you have available, and set a maximum number of missing ingredients or tools.", "recipe-finder-description": "Search for recipes based on ingredients you have on hand. You can also filter by tools you have available, and set a maximum number of missing ingredients or tools.",
"selected-ingredients": "Selected Ingredients", "selected-ingredients": "Выбранные ингредиенты",
"no-ingredients-selected": "No ingredients selected", "no-ingredients-selected": "No ingredients selected",
"missing": "Missing", "missing": "Missing",
"no-recipes-found": "No recipes found", "no-recipes-found": "Рецепты не найдены",
"no-recipes-found-description": "Try adding more ingredients to your search or adjusting your filters", "no-recipes-found-description": "Try adding more ingredients to your search or adjusting your filters",
"include-ingredients-on-hand": "Include Ingredients On Hand", "include-ingredients-on-hand": "Include Ingredients On Hand",
"include-tools-on-hand": "Include Tools On Hand", "include-tools-on-hand": "Include Tools On Hand",
@@ -881,10 +881,10 @@
"completed-on": "Выполнено в {date}", "completed-on": "Выполнено в {date}",
"you-are-offline": "Вы не в сети", "you-are-offline": "Вы не в сети",
"you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.", "you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.",
"are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?", "are-you-sure-you-want-to-check-all-items": "Вы уверены, что хотите выбрать все элементы?",
"are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?", "are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?",
"are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?", "are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?",
"no-shopping-lists-found": "No Shopping Lists Found" "no-shopping-lists-found": "Списки покупок не найдены"
}, },
"sidebar": { "sidebar": {
"all-recipes": "Все рецепты", "all-recipes": "Все рецепты",
@@ -1286,17 +1286,17 @@
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.", "restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others." "manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
}, },
"debug-openai-services": "Debug OpenAI Services", "debug-openai-services": "Отладка OpenAI сервисов",
"debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.", "debug-openai-services-description": "Use this page to debug OpenAI services. You can test your OpenAI connection and see the results here. If you have image services enabled, you can also provide an image.",
"run-test": "Run Test", "run-test": "Запустить тест",
"test-results": "Test Results", "test-results": "Результаты тестов",
"group-delete-note": "Groups with users or households cannot be deleted", "group-delete-note": "Groups with users or households cannot be deleted",
"household-delete-note": "Households with users cannot be deleted" "household-delete-note": "Households with users cannot be deleted"
}, },
"profile": { "profile": {
"welcome-user": "👋 Добро пожаловать, {0}!", "welcome-user": "👋 Добро пожаловать, {0}!",
"description": "Управление настройками профиля, рецептов и группы.", "description": "Управление настройками профиля, рецептов и группы.",
"invite-link": "Invite Link", "invite-link": "Ссылка-приглашение",
"get-invite-link": "Получить ссылку для приглашения", "get-invite-link": "Получить ссылку для приглашения",
"get-public-link": "Получить публичную ссылку", "get-public-link": "Получить публичную ссылку",
"account-summary": "Cведения об учетной записи", "account-summary": "Cведения об учетной записи",

View File

@@ -93,6 +93,12 @@ export interface GroupSummary {
slug: string; slug: string;
preferences?: ReadGroupPreferences | null; preferences?: ReadGroupPreferences | null;
} }
export interface LongLiveTokenCreateResponse {
name: string;
id: number;
createdAt?: string | null;
token: string;
}
export interface LongLiveTokenIn { export interface LongLiveTokenIn {
name: string; name: string;
integrationId?: string; integrationId?: string;
@@ -130,7 +136,6 @@ export interface PrivateUser {
lockedAt?: string | null; lockedAt?: string | null;
} }
export interface LongLiveTokenOut { export interface LongLiveTokenOut {
token: string;
name: string; name: string;
id: number; id: number;
createdAt?: string | null; createdAt?: string | null;

View File

@@ -84,6 +84,7 @@ export type RecipeSearchQuery = {
page?: number; page?: number;
perPage?: number; perPage?: number;
orderBy?: string; orderBy?: string;
orderByNullPosition?: "first" | "last";
_searchSeed?: string; _searchSeed?: string;
}; };

View File

@@ -1,6 +1,6 @@
{ {
"name": "mealie", "name": "mealie",
"version": "2.4.2", "version": "2.5.0",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "nuxt", "dev": "nuxt",

View File

@@ -17,11 +17,69 @@
<v-container> <v-container>
<v-row> <v-row>
<v-col cols="3" class="text-left"> <v-col cols="3" class="text-left">
<ButtonLink :to="`/shopping-lists?disableRedirect=true`" :text="$tc('general.back')" :icon="$globals.icons.backArrow" /> <ButtonLink :to="`/shopping-lists?disableRedirect=true`" :text="$tc('shopping-list.all-lists')" :icon="$globals.icons.backArrow" />
</v-col> </v-col>
<v-col cols="6" class="d-flex justify-center"> <v-col cols="6" class="d-none d-lg-flex justify-center">
<v-img max-height="100" max-width="100" :src="require('~/static/svgs/shopping-cart.svg')"></v-img> <v-img max-height="100" max-width="100" :src="require('~/static/svgs/shopping-cart.svg')"></v-img>
</v-col> </v-col>
<v-col class="d-flex justify-end">
<BaseButtonGroup
:buttons="[
{
icon: $globals.icons.contentCopy,
text: '',
event: 'edit',
children: [
{
icon: $globals.icons.contentCopy,
text: $tc('shopping-list.copy-as-text'),
event: 'copy-plain',
},
{
icon: $globals.icons.contentCopy,
text: $tc('shopping-list.copy-as-markdown'),
event: 'copy-markdown',
},
],
},
{
icon: $globals.icons.checkboxOutline,
text: $tc('shopping-list.check-all-items'),
event: 'check',
},
{
icon: $globals.icons.dotsVertical,
text: '',
event: 'three-dot',
children: [
{
icon: $globals.icons.tags,
text: $tc('shopping-list.toggle-label-sort'),
event: 'sort-by-labels',
},
{
icon: $globals.icons.tags,
text: $tc('shopping-list.reorder-labels'),
event: 'reorder-labels',
},
{
icon: $globals.icons.tags,
text: $tc('shopping-list.manage-labels'),
event: 'manage-labels',
},
],
},
]"
@edit="edit = true"
@three-dot="threeDot = true"
@check="openCheckAll"
@sort-by-labels="sortByLabels"
@copy-plain="copyListItems('plain')"
@copy-markdown="copyListItems('markdown')"
@reorder-labels="toggleReorderLabelsDialog()"
@manage-labels="$router.push(`/group/data/labels`)"
/>
</v-col>
</v-row> </v-row>
</v-container> </v-container>
</template> </template>
@@ -119,27 +177,6 @@
</v-card> </v-card>
</BaseDialog> </BaseDialog>
<!-- Settings -->
<BaseDialog
v-model="settingsDialog"
:icon="$globals.icons.cog"
:title="$t('general.settings')"
@confirm="updateSettings"
>
<v-container>
<v-form>
<v-select
v-model="currentUserId"
:items="allUsers"
item-text="fullName"
item-value="id"
:label="$t('general.owner')"
:prepend-icon="$globals.icons.user"
/>
</v-form>
</v-container>
</BaseDialog>
<!-- Create Item --> <!-- Create Item -->
<div v-if="createEditorOpen"> <div v-if="createEditorOpen">
<ShoppingListItemEditor <ShoppingListItemEditor
@@ -154,70 +191,13 @@
/> />
</div> </div>
<div v-else class="mt-4 d-flex justify-end"> <div v-else class="mt-4 d-flex justify-end">
<BaseButton
v-if="preferences.viewByLabel" edit class="mr-2"
:disabled="$nuxt.isOffline"
@click="toggleReorderLabelsDialog">
<template #icon> {{ $globals.icons.tags }} </template>
{{ $t('shopping-list.reorder-labels') }}
</BaseButton>
<BaseButton create @click="createEditorOpen = true" > {{ $t('general.add') }} </BaseButton> <BaseButton create @click="createEditorOpen = true" > {{ $t('general.add') }} </BaseButton>
</div> </div>
<!-- Action Bar -->
<div class="d-flex justify-end mb-4 mt-2">
<BaseButtonGroup
:buttons="[
{
icon: $globals.icons.contentCopy,
text: '',
event: 'edit',
children: [
{
icon: $globals.icons.contentCopy,
text: $tc('shopping-list.copy-as-text'),
event: 'copy-plain',
},
{
icon: $globals.icons.contentCopy,
text: $tc('shopping-list.copy-as-markdown'),
event: 'copy-markdown',
},
],
},
{
icon: $globals.icons.delete,
text: $tc('shopping-list.delete-checked'),
event: 'delete',
},
{
icon: $globals.icons.tags,
text: $tc('shopping-list.toggle-label-sort'),
event: 'sort-by-labels',
},
{
icon: $globals.icons.checkboxBlankOutline,
text: $tc('shopping-list.uncheck-all-items'),
event: 'uncheck',
},
{
icon: $globals.icons.checkboxOutline,
text: $tc('shopping-list.check-all-items'),
event: 'check',
},
]"
@edit="edit = true"
@delete="openDeleteChecked"
@uncheck="openUncheckAll"
@check="openCheckAll"
@sort-by-labels="sortByLabels"
@copy-plain="copyListItems('plain')"
@copy-markdown="copyListItems('markdown')"
/>
</div>
<!-- Checked Items --> <!-- Checked Items -->
<div v-if="listItems.checked && listItems.checked.length > 0" class="mt-6"> <div v-if="listItems.checked && listItems.checked.length > 0" class="mt-6">
<div class="d-flex">
<div class="flex-grow-1">
<button @click="toggleShowChecked()"> <button @click="toggleShowChecked()">
<span> <span>
<v-icon> <v-icon>
@@ -226,6 +206,26 @@
</span> </span>
{{ $tc('shopping-list.items-checked-count', listItems.checked ? listItems.checked.length : 0) }} {{ $tc('shopping-list.items-checked-count', listItems.checked ? listItems.checked.length : 0) }}
</button> </button>
</div>
<div class="justify-end mt-n2">
<BaseButtonGroup
:buttons="[
{
icon: $globals.icons.checkboxBlankOutline,
text: $tc('shopping-list.uncheck-all-items'),
event: 'uncheck',
},
{
icon: $globals.icons.delete,
text: $tc('shopping-list.delete-checked'),
event: 'delete',
},
]"
@uncheck="openUncheckAll"
@delete="openDeleteChecked"
/>
</div>
</div>
<v-divider class="my-4"></v-divider> <v-divider class="my-4"></v-divider>
<v-expand-transition> <v-expand-transition>
<div v-show="showChecked"> <div v-show="showChecked">
@@ -277,29 +277,6 @@
</RecipeList> </RecipeList>
</section> </section>
</v-lazy> </v-lazy>
<v-lazy>
<div class="d-flex justify-end">
<BaseButton
edit
:disabled="$nuxt.isOffline"
@click="toggleSettingsDialog"
>
<template #icon> {{ $globals.icons.cog }} </template>
{{ $t('general.settings') }}
</BaseButton>
</div>
</v-lazy>
<v-lazy>
<div v-if="$nuxt.isOnline" class="d-flex justify-end mt-10">
<ButtonLink
:to="`/group/data/labels`"
:text="$tc('shopping-list.manage-labels')"
:icon="$globals.icons.tags"
/>
</div>
</v-lazy>
<WakelockSwitch/> <WakelockSwitch/>
</v-container> </v-container>
</template> </template>
@@ -314,7 +291,6 @@ import { useUserApi } from "~/composables/api";
import MultiPurposeLabelSection from "~/components/Domain/ShoppingList/MultiPurposeLabelSection.vue" import MultiPurposeLabelSection from "~/components/Domain/ShoppingList/MultiPurposeLabelSection.vue"
import ShoppingListItem from "~/components/Domain/ShoppingList/ShoppingListItem.vue"; import ShoppingListItem from "~/components/Domain/ShoppingList/ShoppingListItem.vue";
import { ShoppingListItemOut, ShoppingListMultiPurposeLabelOut, ShoppingListOut } from "~/lib/api/types/household"; import { ShoppingListItemOut, ShoppingListMultiPurposeLabelOut, ShoppingListOut } from "~/lib/api/types/household";
import { UserOut } from "~/lib/api/types/user";
import RecipeList from "~/components/Domain/Recipe/RecipeList.vue"; import RecipeList from "~/components/Domain/Recipe/RecipeList.vue";
import ShoppingListItemEditor from "~/components/Domain/ShoppingList/ShoppingListItemEditor.vue"; import ShoppingListItemEditor from "~/components/Domain/ShoppingList/ShoppingListItemEditor.vue";
import { useFoodStore, useLabelStore, useUnitStore } from "~/composables/store"; import { useFoodStore, useLabelStore, useUnitStore } from "~/composables/store";
@@ -349,8 +325,8 @@ export default defineComponent({
const userApi = useUserApi(); const userApi = useUserApi();
const edit = ref(false); const edit = ref(false);
const threeDot = ref(false);
const reorderLabelsDialog = ref(false); const reorderLabelsDialog = ref(false);
const settingsDialog = ref(false);
const preserveItemOrder = ref(false); const preserveItemOrder = ref(false);
const route = useRoute(); const route = useRoute();
@@ -678,13 +654,6 @@ export default defineComponent({
localLabels.value = shoppingList.value?.labelSettings localLabels.value = shoppingList.value?.labelSettings
} }
async function toggleSettingsDialog() {
if (!settingsDialog.value) {
await fetchAllUsers();
}
settingsDialog.value = !settingsDialog.value;
}
function updateLabelOrder(labelSettings: ShoppingListMultiPurposeLabelOut[]) { function updateLabelOrder(labelSettings: ShoppingListMultiPurposeLabelOut[]) {
if (!shoppingList.value) { if (!shoppingList.value) {
return; return;
@@ -1064,39 +1033,6 @@ export default defineComponent({
refresh(); refresh();
} }
// ===============================================================
// Shopping List Settings
const allUsers = ref<UserOut[]>([]);
const currentUserId = ref<string | undefined>();
async function fetchAllUsers() {
const { data } = await userApi.households.fetchMembers();
if (!data) {
return;
}
// update current user
allUsers.value = data.items.sort((a, b) => ((a.fullName || "") < (b.fullName || "") ? -1 : 1));
currentUserId.value = shoppingList.value?.userId;
}
async function updateSettings() {
if (!shoppingList.value || !currentUserId.value) {
return;
}
loadingCounter.value += 1;
const { data } = await userApi.shopping.lists.updateOne(
shoppingList.value.id,
{...shoppingList.value, userId: currentUserId.value},
);
loadingCounter.value -= 1;
if (data) {
refresh();
}
}
return { return {
...toRefs(state), ...toRefs(state),
addRecipeReferenceToList, addRecipeReferenceToList,
@@ -1112,6 +1048,7 @@ export default defineComponent({
openDeleteChecked, openDeleteChecked,
deleteListItem, deleteListItem,
edit, edit,
threeDot,
getLabelColor, getLabelColor,
groupSlug, groupSlug,
itemsByLabel, itemsByLabel,
@@ -1123,8 +1060,6 @@ export default defineComponent({
removeRecipeReferenceToList, removeRecipeReferenceToList,
reorderLabelsDialog, reorderLabelsDialog,
toggleReorderLabelsDialog, toggleReorderLabelsDialog,
settingsDialog,
toggleSettingsDialog,
localLabels, localLabels,
updateLabelOrder, updateLabelOrder,
cancelLabelOrder, cancelLabelOrder,
@@ -1144,9 +1079,6 @@ export default defineComponent({
updateIndexUncheckedByLabel, updateIndexUncheckedByLabel,
allUnits, allUnits,
allFoods, allFoods,
allUsers,
currentUserId,
updateSettings,
getTextColor, getTextColor,
}; };
}, },

View File

@@ -6,6 +6,27 @@
</v-card-text> </v-card-text>
</BaseDialog> </BaseDialog>
<!-- Settings -->
<BaseDialog
v-model="ownerDialog"
:icon="$globals.icons.admin"
:title="$t('user.edit-user')"
@confirm="updateOwner"
>
<v-container>
<v-form>
<v-select
v-model="updateUserId"
:items="allUsers"
item-text="fullName"
item-value="id"
:label="$t('general.owner')"
:prepend-icon="$globals.icons.user"
/>
</v-form>
</v-container>
</BaseDialog>
<BaseDialog v-model="deleteDialog" :title="$tc('general.confirm')" color="error" @confirm="deleteOne"> <BaseDialog v-model="deleteDialog" :title="$tc('general.confirm')" color="error" @confirm="deleteOne">
<v-card-text>{{ $t('shopping-list.are-you-sure-you-want-to-delete-this-item') }}</v-card-text> <v-card-text>{{ $t('shopping-list.are-you-sure-you-want-to-delete-this-item') }}</v-card-text>
</BaseDialog> </BaseDialog>
@@ -38,26 +59,34 @@
<v-icon left> <v-icon left>
{{ $globals.icons.cartCheck }} {{ $globals.icons.cartCheck }}
</v-icon> </v-icon>
<div class="flex-grow-1">
{{ list.name }} {{ list.name }}
<v-btn class="ml-auto" icon @click.prevent="openDelete(list.id)"> </div>
<div class="d-flex justify-end">
<v-btn icon @click.prevent="toggleOwnerDialog(list)">
<v-icon>
{{ $globals.icons.user }}
</v-icon>
</v-btn>
<v-btn icon @click.prevent="openDelete(list.id)">
<v-icon> <v-icon>
{{ $globals.icons.delete }} {{ $globals.icons.delete }}
</v-icon> </v-icon>
</v-btn> </v-btn>
</div>
</v-card-title> </v-card-title>
</v-card> </v-card>
</section> </section>
<div class="d-flex justify-end mt-10">
<ButtonLink :to="`/group/data/labels`" :text="$tc('shopping-list.manage-labels')" :icon="$globals.icons.tags" />
</div>
</v-container> </v-container>
</template> </template>
<script lang="ts"> <script lang="ts">
import { computed, defineComponent, useAsync, useContext, reactive, ref, toRefs, useRoute, useRouter, watch } from "@nuxtjs/composition-api"; import { computed, defineComponent, useAsync, useContext, reactive, ref, toRefs, useRoute, useRouter, watch } from "@nuxtjs/composition-api";
import { ShoppingListOut } from "~/lib/api/types/household";
import { useUserApi } from "~/composables/api"; import { useUserApi } from "~/composables/api";
import { useAsyncKey } from "~/composables/use-utils"; import { useAsyncKey } from "~/composables/use-utils";
import { useShoppingListPreferences } from "~/composables/use-users/preferences"; import { useShoppingListPreferences } from "~/composables/use-users/preferences";
import { UserOut } from "~/lib/api/types/user";
export default defineComponent({ export default defineComponent({
middleware: "auth", middleware: "auth",
@@ -77,6 +106,8 @@ export default defineComponent({
createDialog: false, createDialog: false,
deleteDialog: false, deleteDialog: false,
deleteTarget: "", deleteTarget: "",
ownerDialog: false,
ownerTarget: ref<ShoppingListOut | null>(null),
}); });
const shoppingLists = useAsync(async () => { const shoppingLists = useAsync(async () => {
@@ -136,6 +167,53 @@ export default defineComponent({
} }
} }
async function toggleOwnerDialog(list: ShoppingListOut) {
if (!state.ownerDialog) {
state.ownerTarget = list;
await fetchAllUsers();
}
state.ownerDialog = !state.ownerDialog;
}
// ===============================================================
// Shopping List Edit User/Owner
const allUsers = ref<UserOut[]>([]);
const updateUserId = ref<string | undefined>();
async function fetchAllUsers() {
const { data } = await userApi.households.fetchMembers();
if (!data) {
return;
}
// update current user
allUsers.value = data.items.sort((a, b) => ((a.fullName || "") < (b.fullName || "") ? -1 : 1));
updateUserId.value = state.ownerTarget?.userId;
}
async function updateOwner() {
if (!state.ownerTarget || !updateUserId.value) {
return;
}
// user has not changed, so we should not update
if (state.ownerTarget.userId === updateUserId.value) {
return;
}
// get full list, so the move does not delete shopping list items
const { data: fullList } = await userApi.shopping.lists.getOne(state.ownerTarget.id);
if (!fullList) {
return;
}
const { data } = await userApi.shopping.lists.updateOne(
state.ownerTarget.id,
{...fullList, userId: updateUserId.value},
);
if (data) {
refresh();
}
}
function openDelete(id: string) { function openDelete(id: string) {
state.deleteDialog = true; state.deleteDialog = true;
state.deleteTarget = id; state.deleteTarget = id;
@@ -155,6 +233,10 @@ export default defineComponent({
preferences, preferences,
shoppingListChoices, shoppingListChoices,
createOne, createOne,
toggleOwnerDialog,
allUsers,
updateUserId,
updateOwner,
deleteOne, deleteOne,
openDelete, openDelete,
}; };

View File

@@ -42,7 +42,7 @@
"generic-updated": "{name} blev opdateret", "generic-updated": "{name} blev opdateret",
"generic-created-with-url": "{name} er oprettet, {url}", "generic-created-with-url": "{name} er oprettet, {url}",
"generic-updated-with-url": "{name} er blevet opdateret, {url}", "generic-updated-with-url": "{name} er blevet opdateret, {url}",
"generic-duplicated": "{name} er blevet dublikeret", "generic-duplicated": "{name} er blevet duplikeret",
"generic-deleted": "{name} er blevet slettet" "generic-deleted": "{name} er blevet slettet"
}, },
"datetime": { "datetime": {
@@ -60,7 +60,7 @@
"header_text": "Glemt adgangskode", "header_text": "Glemt adgangskode",
"message_top": "Du har anmodet om at nulstille din adgangskode.", "message_top": "Du har anmodet om at nulstille din adgangskode.",
"message_bottom": "Klik på knappen ovenfor for at nulstille din adgangskode.", "message_bottom": "Klik på knappen ovenfor for at nulstille din adgangskode.",
"button_text": "Nulstil adgangskoden" "button_text": "Nulstil adgangskode"
}, },
"invitation": { "invitation": {
"subject": "Invitation til at deltage i Mealie", "subject": "Invitation til at deltage i Mealie",

View File

@@ -4,18 +4,18 @@
}, },
"recipe": { "recipe": {
"unique-name-error": "Reseptien nimien täytyy olla yksilöllisiä", "unique-name-error": "Reseptien nimien täytyy olla yksilöllisiä",
"recipe-created": "Recipe Created", "recipe-created": "Resepti luotu",
"recipe-defaults": { "recipe-defaults": {
"ingredient-note": "1 kuppi jauhoja", "ingredient-note": "1 kupillinen jauhoja",
"step-text": "Recipe steps as well as other fields in the recipe page support markdown syntax.\n\n**Add a link**\n\n[My Link](https://demo.mealie.io)\n" "step-text": "Reseptin vaiheet sekä muut kentät reseptisivulla tukevat markdown-syntaksia.\n\n**Lisää linkki**\n\n[Oma linkki](https://demo.mealie.io)\n"
}, },
"servings-text": { "servings-text": {
"makes": "Makes", "makes": "Tekee",
"serves": "Serves", "serves": "Annoksia",
"serving": "Serving", "serving": "Annos",
"servings": "Servings", "servings": "Annosta",
"yield": "Yield", "yield": "Tuotto",
"yields": "Yields" "yields": "Tuottaa"
} }
}, },
"mealplan": { "mealplan": {
@@ -25,7 +25,7 @@
"user-updated": "Käyttäjä päivitetty", "user-updated": "Käyttäjä päivitetty",
"password-updated": "Salasana päivitetty", "password-updated": "Salasana päivitetty",
"invalid-current-password": "Nykyinen salasana ei kelpaa", "invalid-current-password": "Nykyinen salasana ei kelpaa",
"ldap-update-password-unavailable": "Salasanaa ei voitu päivittää. Käyttäjä hallinnoi LDAP:ia." "ldap-update-password-unavailable": "Salasanaa ei voitu päivittää, sillä käyttäjä on LDAP-hakemiston alainen"
}, },
"group": { "group": {
"report-deleted": "Raportti poistettu." "report-deleted": "Raportti poistettu."
@@ -56,25 +56,25 @@
}, },
"emails": { "emails": {
"password": { "password": {
"subject": "Mealie Forgot Password", "subject": "Mealie Unohtunut salasana",
"header_text": "Forgot Password", "header_text": "Unohdin salasanan",
"message_top": "You have requested to reset your password.", "message_top": "Olet pyytänyt salasanasi nollausta.",
"message_bottom": "Please click the button above to reset your password.", "message_bottom": "Klikkaa yllä olevaa painiketta nollataksesi salasanasi.",
"button_text": "Reset Password" "button_text": "Nollaa salasana"
}, },
"invitation": { "invitation": {
"subject": "Invitation to join Mealie", "subject": "Kutsu liittyä Mealieen",
"header_text": "You're Invited!", "header_text": "Sinut on kutsuttu.",
"message_top": "You have been invited to join Mealie.", "message_top": "Sinut on kutsuttu liittymään Mealieen.",
"message_bottom": "Please click the button above to accept the invitation.", "message_bottom": "Ole hyvä ja klikkaa yllä olevaa painiketta hyväksyäksesi kutsun.",
"button_text": "Accept Invitation" "button_text": "Hyväksy kutsu"
}, },
"test": { "test": {
"subject": "Mealie Test Email", "subject": "Mealie Testiviesti",
"header_text": "Test Email", "header_text": "Testiviesti",
"message_top": "This is a test email.", "message_top": "Tämä on testiviesti.",
"message_bottom": "Please click the button above to test the email.", "message_bottom": "Ole hyvä ja klikkaa yllä olevaa painiketta testataksesi sähköpostia.",
"button_text": "Open Mealie" "button_text": "Avaa Mealie"
} }
} }
} }

View File

@@ -4,18 +4,18 @@
}, },
"recipe": { "recipe": {
"unique-name-error": "Les noms de recette doivent être uniques", "unique-name-error": "Les noms de recette doivent être uniques",
"recipe-created": "Recipe Created", "recipe-created": "Recette créée",
"recipe-defaults": { "recipe-defaults": {
"ingredient-note": "100g de farine", "ingredient-note": "100g de farine",
"step-text": "Les étapes de la recette ainsi que les autres champs de la page de recette supportent la syntaxe markdown.\n\n**Ajouter un lien**\n\n[Mon lien](https://demo.mealie.io)\n" "step-text": "Les étapes de la recette ainsi que les autres champs de la page de recette supportent la syntaxe markdown.\n\n**Ajouter un lien**\n\n[Mon lien](https://demo.mealie.io)\n"
}, },
"servings-text": { "servings-text": {
"makes": "Makes", "makes": "Fait",
"serves": "Serves", "serves": "Pour",
"serving": "Serving", "serving": "Portion",
"servings": "Servings", "servings": "Portions",
"yield": "Yield", "yield": "Quantité",
"yields": "Yields" "yields": "Produit"
} }
}, },
"mealplan": { "mealplan": {

View File

@@ -4,18 +4,18 @@
}, },
"recipe": { "recipe": {
"unique-name-error": "Les noms de recette doivent être uniques", "unique-name-error": "Les noms de recette doivent être uniques",
"recipe-created": "Recipe Created", "recipe-created": "Recette créée",
"recipe-defaults": { "recipe-defaults": {
"ingredient-note": "1 tasse de Farine", "ingredient-note": "1 tasse de Farine",
"step-text": "Les étapes de la recette ainsi que les autres champs de la page de recette supportent la syntaxe markdown.\n\n**Ajouter un lien**\n\n[Mon lien](https://demo.mealie.io)\n" "step-text": "Les étapes de la recette ainsi que les autres champs de la page de recette supportent la syntaxe markdown.\n\n**Ajouter un lien**\n\n[Mon lien](https://demo.mealie.io)\n"
}, },
"servings-text": { "servings-text": {
"makes": "Makes", "makes": "Fait",
"serves": "Serves", "serves": "Pour",
"serving": "Serving", "serving": "Portion",
"servings": "Servings", "servings": "Portions",
"yield": "Yield", "yield": "Quantité",
"yields": "Yields" "yields": "Produit"
} }
}, },
"mealplan": { "mealplan": {

View File

@@ -4,7 +4,7 @@
}, },
"recipe": { "recipe": {
"unique-name-error": "Receptų pavadinimai turi būti unikalūs", "unique-name-error": "Receptų pavadinimai turi būti unikalūs",
"recipe-created": "Recipe Created", "recipe-created": "Receptas sukurtas",
"recipe-defaults": { "recipe-defaults": {
"ingredient-note": "1 Cup Flour", "ingredient-note": "1 Cup Flour",
"step-text": "Recipe steps as well as other fields in the recipe page support markdown syntax.\n\n**Add a link**\n\n[My Link](https://demo.mealie.io)\n" "step-text": "Recipe steps as well as other fields in the recipe page support markdown syntax.\n\n**Add a link**\n\n[My Link](https://demo.mealie.io)\n"
@@ -13,7 +13,7 @@
"makes": "Makes", "makes": "Makes",
"serves": "Serves", "serves": "Serves",
"serving": "Serving", "serving": "Serving",
"servings": "Servings", "servings": "Porcijos",
"yield": "Yield", "yield": "Yield",
"yields": "Yields" "yields": "Yields"
} }
@@ -46,13 +46,13 @@
"generic-deleted": "{name} ištrintas" "generic-deleted": "{name} ištrintas"
}, },
"datetime": { "datetime": {
"year": "year|years", "year": "metai|metai",
"day": "day|days", "day": "diena|dienos",
"hour": "hour|hours", "hour": "valanda|valandos",
"minute": "minute|minutes", "minute": "minutė|minutės",
"second": "second|seconds", "second": "sekundė|sekundės",
"millisecond": "millisecond|milliseconds", "millisecond": "milisekundė|milisekundės",
"microsecond": "microsecond|microseconds" "microsecond": "mikrosekundė|mikrosekundės"
}, },
"emails": { "emails": {
"password": { "password": {
@@ -67,12 +67,12 @@
"header_text": "You're Invited!", "header_text": "You're Invited!",
"message_top": "You have been invited to join Mealie.", "message_top": "You have been invited to join Mealie.",
"message_bottom": "Please click the button above to accept the invitation.", "message_bottom": "Please click the button above to accept the invitation.",
"button_text": "Accept Invitation" "button_text": "Priimti pakvietimą"
}, },
"test": { "test": {
"subject": "Mealie Test Email", "subject": "Mealie Test Email",
"header_text": "Test Email", "header_text": "Test Email",
"message_top": "This is a test email.", "message_top": "Tai bandomasis el. laiškas.",
"message_bottom": "Please click the button above to test the email.", "message_bottom": "Please click the button above to test the email.",
"button_text": "Open Mealie" "button_text": "Open Mealie"
} }

View File

@@ -4,7 +4,7 @@
}, },
"recipe": { "recipe": {
"unique-name-error": "Nomes de receitas devem ser únicos", "unique-name-error": "Nomes de receitas devem ser únicos",
"recipe-created": "Recipe Created", "recipe-created": "Receita criada",
"recipe-defaults": { "recipe-defaults": {
"ingredient-note": "1 Xícara de Farinha", "ingredient-note": "1 Xícara de Farinha",
"step-text": "Passos das receitas, assim como outros campos na página da receita, suportam sintaxe \"markdown\".\n\n**Adicione um link**\n\n[Meu Link](https://demo.mealie.io)\n" "step-text": "Passos das receitas, assim como outros campos na página da receita, suportam sintaxe \"markdown\".\n\n**Adicione um link**\n\n[Meu Link](https://demo.mealie.io)\n"
@@ -12,8 +12,8 @@
"servings-text": { "servings-text": {
"makes": "Makes", "makes": "Makes",
"serves": "Serves", "serves": "Serves",
"serving": "Serving", "serving": "Porção",
"servings": "Servings", "servings": "Porções",
"yield": "Yield", "yield": "Yield",
"yields": "Yields" "yields": "Yields"
} }

View File

@@ -4,7 +4,7 @@
}, },
"recipe": { "recipe": {
"unique-name-error": "Название рецепта должно быть уникальным", "unique-name-error": "Название рецепта должно быть уникальным",
"recipe-created": "Recipe Created", "recipe-created": "Рецепт создан",
"recipe-defaults": { "recipe-defaults": {
"ingredient-note": "1 Чашка муки", "ingredient-note": "1 Чашка муки",
"step-text": "Шаги рецепта, как и другие поля на странице рецепта, поддерживают синтаксис Markdown.\n\n**Добавить ссылку**\n\n[Моя Ссылка](https://demo.mealie.io)\n" "step-text": "Шаги рецепта, как и другие поля на странице рецепта, поддерживают синтаксис Markdown.\n\n**Добавить ссылку**\n\n[Моя Ссылка](https://demo.mealie.io)\n"
@@ -12,8 +12,8 @@
"servings-text": { "servings-text": {
"makes": "Makes", "makes": "Makes",
"serves": "Serves", "serves": "Serves",
"serving": "Serving", "serving": "Порция",
"servings": "Servings", "servings": "Порции",
"yield": "Yield", "yield": "Yield",
"yields": "Yields" "yields": "Yields"
} }

View File

@@ -48,7 +48,7 @@
}, },
"bell-peppers": { "bell-peppers": {
"name": "papriky", "name": "papriky",
"plural_name": "bell peppers" "plural_name": "papriky"
}, },
"blackberries": { "blackberries": {
"name": "ostružiny" "name": "ostružiny"
@@ -260,8 +260,8 @@
"name": "kapradiny" "name": "kapradiny"
}, },
"fiddlehead-fern": { "fiddlehead-fern": {
"name": "fiddlehead fern", "name": "kapradina",
"plural_name": "fiddlehead ferns" "plural_name": "kapradiny"
}, },
"fish": { "fish": {
"name": "ryba" "name": "ryba"

View File

@@ -9,7 +9,7 @@
"name": "ansjoser" "name": "ansjoser"
}, },
"apples": { "apples": {
"name": "æbler", "name": "æble",
"plural_name": "æbler" "plural_name": "æbler"
}, },
"artichoke": { "artichoke": {

View File

@@ -337,7 +337,7 @@
}, },
"jackfruit": { "jackfruit": {
"name": "τζάκφρουτ", "name": "τζάκφρουτ",
"plural_name": "jackfruits" "plural_name": "τζάκφρουτ"
}, },
"jaggery": { "jaggery": {
"name": "ζάχαρη jaggery" "name": "ζάχαρη jaggery"
@@ -364,7 +364,7 @@
"name": "κούμαρα" "name": "κούμαρα"
}, },
"leavening-agents": { "leavening-agents": {
"name": "leavening agents" "name": "διογκωτικά"
}, },
"leek": { "leek": {
"name": "πράσο", "name": "πράσο",

View File

@@ -3,73 +3,73 @@
"name": "koristekurpitsa" "name": "koristekurpitsa"
}, },
"alfalfa-sprouts": { "alfalfa-sprouts": {
"name": "alfalfaidut" "name": "alfalfaituja"
}, },
"anchovies": { "anchovies": {
"name": "anjovikset" "name": "anjoviksia"
}, },
"apples": { "apples": {
"name": "omenat", "name": "omenat",
"plural_name": "apples" "plural_name": "omenaa"
}, },
"artichoke": { "artichoke": {
"name": "artisokka" "name": "artisokkaa"
}, },
"arugula": { "arugula": {
"name": "rukola" "name": "rukola"
}, },
"asparagus": { "asparagus": {
"name": "parsa" "name": "parsaa"
}, },
"avocado": { "avocado": {
"name": "avokado", "name": "avokado",
"plural_name": "avocado" "plural_name": "avokadoa"
}, },
"bacon": { "bacon": {
"name": "pekoni" "name": "pekonia"
}, },
"baking-powder": { "baking-powder": {
"name": "leivinjauhe" "name": "leivinjauhetta"
}, },
"baking-soda": { "baking-soda": {
"name": "ruokasooda" "name": "ruokasoodaa"
}, },
"baking-sugar": { "baking-sugar": {
"name": "leivontasokeri" "name": "leivontasokeria"
}, },
"bar-sugar": { "bar-sugar": {
"name": "sirosokeri" "name": "sirosokeri"
}, },
"basil": { "basil": {
"name": "basilika" "name": "basilikaa"
}, },
"beans": { "beans": {
"name": "pavut" "name": "pavut"
}, },
"bell-peppers": { "bell-peppers": {
"name": "paprika", "name": "paprika",
"plural_name": "bell peppers" "plural_name": "paprikaa"
}, },
"blackberries": { "blackberries": {
"name": "karhunvatukat" "name": "karhunvatukoita"
}, },
"bok-choy": { "bok-choy": {
"name": "paksoi" "name": "paksoita"
}, },
"brassicas": { "brassicas": {
"name": "kaalit" "name": "kaalit"
}, },
"bread": { "bread": {
"name": "leipä" "name": "leipää"
}, },
"breadfruit": { "breadfruit": {
"name": "leipäpuun hedelmä" "name": "leipäpuun hedelmää"
}, },
"broccoflower": { "broccoflower": {
"name": "parsakukkakaali" "name": "parsakukkakaali"
}, },
"broccoli": { "broccoli": {
"name": "parsakaali" "name": "parsakaalia"
}, },
"broccoli-rabe": { "broccoli-rabe": {
"name": "varsiparsakaali" "name": "varsiparsakaali"
@@ -78,7 +78,7 @@
"name": "broccolini" "name": "broccolini"
}, },
"brown-sugar": { "brown-sugar": {
"name": "fariinisokeri" "name": "fariinisokeria"
}, },
"brussels-sprouts": { "brussels-sprouts": {
"name": "ruusukaalit" "name": "ruusukaalit"
@@ -94,7 +94,7 @@
}, },
"cabbage": { "cabbage": {
"name": "kaali", "name": "kaali",
"plural_name": "cabbages" "plural_name": "kaalia"
}, },
"cactus-edible": { "cactus-edible": {
"name": "kaktus, syötävä" "name": "kaktus, syötävä"
@@ -116,7 +116,7 @@
}, },
"carrot": { "carrot": {
"name": "porkkana", "name": "porkkana",
"plural_name": "carrots" "plural_name": "porkkanaa"
}, },
"caster-sugar": { "caster-sugar": {
"name": "castersokeri" "name": "castersokeri"
@@ -129,7 +129,7 @@
}, },
"cauliflower": { "cauliflower": {
"name": "kukkakaali", "name": "kukkakaali",
"plural_name": "cauliflowers" "plural_name": "kukkakaalia"
}, },
"cayenne-pepper": { "cayenne-pepper": {
"name": "cayenne-pippuri" "name": "cayenne-pippuri"
@@ -154,7 +154,7 @@
}, },
"chilli-peppers": { "chilli-peppers": {
"name": "chilipaprikat", "name": "chilipaprikat",
"plural_name": "chilli peppers" "plural_name": "chilipippuria"
}, },
"chinese-leaves": { "chinese-leaves": {
"name": "kiinankaali" "name": "kiinankaali"
@@ -176,7 +176,7 @@
}, },
"coconut": { "coconut": {
"name": "kookospähkinä", "name": "kookospähkinä",
"plural_name": "coconuts" "plural_name": "kookospähkinää"
}, },
"coconut-milk": { "coconut-milk": {
"name": "kookosmaito" "name": "kookosmaito"
@@ -198,7 +198,7 @@
}, },
"corn": { "corn": {
"name": "maissi", "name": "maissi",
"plural_name": "corns" "plural_name": "maissia"
}, },
"corn-syrup": { "corn-syrup": {
"name": "maissisiirappi" "name": "maissisiirappi"
@@ -214,7 +214,7 @@
}, },
"cucumber": { "cucumber": {
"name": "kurkku", "name": "kurkku",
"plural_name": "cucumbers" "plural_name": "kurkkua"
}, },
"cumin": { "cumin": {
"name": "kumina" "name": "kumina"
@@ -240,15 +240,15 @@
}, },
"eggplant": { "eggplant": {
"name": "munakoiso", "name": "munakoiso",
"plural_name": "eggplants" "plural_name": "munakoisoa"
}, },
"eggs": { "eggs": {
"name": "munat", "name": "munat",
"plural_name": "eggs" "plural_name": "kananmunaa"
}, },
"endive": { "endive": {
"name": "endiivit", "name": "endiivit",
"plural_name": "endives" "plural_name": "endiiviä"
}, },
"fats": { "fats": {
"name": "rasvat" "name": "rasvat"
@@ -292,7 +292,7 @@
}, },
"garlic": { "garlic": {
"name": "valkosipuli", "name": "valkosipuli",
"plural_name": "garlics" "plural_name": "valkosipuleja"
}, },
"gem-squash": { "gem-squash": {
"name": "kurpitsa" "name": "kurpitsa"
@@ -317,7 +317,7 @@
}, },
"green-onion": { "green-onion": {
"name": "vihreä sipuli", "name": "vihreä sipuli",
"plural_name": "green onions" "plural_name": "vihreää sipulia"
}, },
"heart-of-palm": { "heart-of-palm": {
"name": "palmun sydän", "name": "palmun sydän",
@@ -337,7 +337,7 @@
}, },
"jackfruit": { "jackfruit": {
"name": "jakkihedelmä", "name": "jakkihedelmä",
"plural_name": "jackfruits" "plural_name": "jakkihedelmää"
}, },
"jaggery": { "jaggery": {
"name": "raakasokeri" "name": "raakasokeri"
@@ -368,7 +368,7 @@
}, },
"leek": { "leek": {
"name": "purjo", "name": "purjo",
"plural_name": "leeks" "plural_name": "purjoa"
}, },
"legumes": { "legumes": {
"name": "palkokasvit" "name": "palkokasvit"
@@ -384,7 +384,7 @@
}, },
"liver": { "liver": {
"name": "maksa", "name": "maksa",
"plural_name": "livers" "plural_name": "maksaa"
}, },
"maize": { "maize": {
"name": "maissi" "name": "maissi"
@@ -403,7 +403,7 @@
}, },
"mushroom": { "mushroom": {
"name": "sieni", "name": "sieni",
"plural_name": "mushrooms" "plural_name": "sientä"
}, },
"mussels": { "mussels": {
"name": "sinisimpukka" "name": "sinisimpukka"
@@ -425,13 +425,13 @@
}, },
"octopuses": { "octopuses": {
"name": "mustekalat", "name": "mustekalat",
"plural_name": "octopuses" "plural_name": "mustekalaa"
}, },
"oils": { "oils": {
"name": "öljyt" "name": "öljyt"
}, },
"okra": { "okra": {
"name": "okra" "name": "okraa"
}, },
"olive": { "olive": {
"name": "oliivi" "name": "oliivi"
@@ -450,10 +450,10 @@
}, },
"oranges": { "oranges": {
"name": "appelsiinit", "name": "appelsiinit",
"plural_name": "oranges" "plural_name": "appelsiinia"
}, },
"oregano": { "oregano": {
"name": "oregano" "name": "oreganoa"
}, },
"oysters": { "oysters": {
"name": "osterit" "name": "osterit"
@@ -462,40 +462,40 @@
"name": "panch puran" "name": "panch puran"
}, },
"paprika": { "paprika": {
"name": "paprika" "name": "paprikajauhetta"
}, },
"parsley": { "parsley": {
"name": "persilja" "name": "persilja"
}, },
"parsnip": { "parsnip": {
"name": "palsternakka", "name": "palsternakka",
"plural_name": "parsnips" "plural_name": "palsternakkaa"
}, },
"pear": { "pear": {
"name": "päärynä", "name": "päärynä",
"plural_name": "pears" "plural_name": "päärynää"
}, },
"peas": { "peas": {
"name": "herneet" "name": "herneet"
}, },
"pepper": { "pepper": {
"name": "pippuri", "name": "pippuri",
"plural_name": "peppers" "plural_name": "pippuria"
}, },
"pineapple": { "pineapple": {
"name": "ananas", "name": "ananas",
"plural_name": "pineapples" "plural_name": "ananasta"
}, },
"plantain": { "plantain": {
"name": "keittobanaani", "name": "keittobanaani",
"plural_name": "plantains" "plural_name": "keittobanaania"
}, },
"poppy-seeds": { "poppy-seeds": {
"name": "unikonsiemenet" "name": "unikonsiemenet"
}, },
"potato": { "potato": {
"name": "peruna", "name": "peruna",
"plural_name": "potatoes" "plural_name": "perunaa"
}, },
"poultry": { "poultry": {
"name": "siipikarja" "name": "siipikarja"
@@ -505,14 +505,14 @@
}, },
"pumpkin": { "pumpkin": {
"name": "kurpitsa", "name": "kurpitsa",
"plural_name": "pumpkins" "plural_name": "kurpitsaa"
}, },
"pumpkin-seeds": { "pumpkin-seeds": {
"name": "kurpitsansiemen" "name": "kurpitsansiemen"
}, },
"radish": { "radish": {
"name": "retiisi", "name": "retiisi",
"plural_name": "radishes" "plural_name": "retiisiä"
}, },
"raw-sugar": { "raw-sugar": {
"name": "raakasokeri" "name": "raakasokeri"
@@ -543,7 +543,7 @@
}, },
"scallion": { "scallion": {
"name": "vihersipuli", "name": "vihersipuli",
"plural_name": "scallions" "plural_name": "kevätsipulia"
}, },
"seafood": { "seafood": {
"name": "merenelävät" "name": "merenelävät"
@@ -556,7 +556,7 @@
}, },
"shallot": { "shallot": {
"name": "salottisipuli", "name": "salottisipuli",
"plural_name": "shallots" "plural_name": "salottisipulia"
}, },
"skate": { "skate": {
"name": "skate-kala" "name": "skate-kala"
@@ -585,7 +585,7 @@
}, },
"spring-onion": { "spring-onion": {
"name": "kevätsipuli", "name": "kevätsipuli",
"plural_name": "spring onions" "plural_name": "kevätsipulia"
}, },
"squash": { "squash": {
"name": "kurpitsa", "name": "kurpitsa",
@@ -602,7 +602,7 @@
}, },
"sunchoke": { "sunchoke": {
"name": "maa-artisokka", "name": "maa-artisokka",
"plural_name": "sunchokes" "plural_name": "maa-artisokkaa"
}, },
"sunflower-seeds": { "sunflower-seeds": {
"name": "auringonkukansiemenet" "name": "auringonkukansiemenet"
@@ -612,35 +612,35 @@
}, },
"sweet-potato": { "sweet-potato": {
"name": "bataatti", "name": "bataatti",
"plural_name": "sweet potatoes" "plural_name": "bataattia"
}, },
"sweetcorn": { "sweetcorn": {
"name": "maissi", "name": "maissi",
"plural_name": "sweetcorns" "plural_name": "sokerimaissia"
}, },
"sweeteners": { "sweeteners": {
"name": "makeutusaineet" "name": "makeutusaineet"
}, },
"tahini": { "tahini": {
"name": "tahini" "name": "tahinia"
}, },
"taro": { "taro": {
"name": "taaro", "name": "taaro",
"plural_name": "taroes" "plural_name": "taaroa"
}, },
"teff": { "teff": {
"name": "teff" "name": "teff"
}, },
"tomato": { "tomato": {
"name": "tomaatti", "name": "tomaatti",
"plural_name": "tomatoes" "plural_name": "tomaattia"
}, },
"trout": { "trout": {
"name": "taimen" "name": "taimen"
}, },
"tubers": { "tubers": {
"name": "mukulat", "name": "mukulat",
"plural_name": "tubers" "plural_name": "mukulaa"
}, },
"tuna": { "tuna": {
"name": "tonnikala" "name": "tonnikala"
@@ -650,7 +650,7 @@
}, },
"turnip": { "turnip": {
"name": "nauris", "name": "nauris",
"plural_name": "turnips" "plural_name": "naurista"
}, },
"unrefined-sugar": { "unrefined-sugar": {
"name": "puhdistamaton sokeri" "name": "puhdistamaton sokeri"
@@ -666,11 +666,11 @@
}, },
"watermelon": { "watermelon": {
"name": "vesimeloni", "name": "vesimeloni",
"plural_name": "watermelons" "plural_name": "vesimelonia"
}, },
"white-mushroom": { "white-mushroom": {
"name": "herkkusieni", "name": "herkkusieni",
"plural_name": "white mushrooms" "plural_name": "herkkusientä"
}, },
"white-sugar": { "white-sugar": {
"name": "valkoinen sokeri" "name": "valkoinen sokeri"
@@ -680,13 +680,13 @@
}, },
"yam": { "yam": {
"name": "hillo", "name": "hillo",
"plural_name": "yams" "plural_name": "jamssia"
}, },
"yeast": { "yeast": {
"name": "hiiva" "name": "hiiva"
}, },
"zucchini": { "zucchini": {
"name": "kesäkurpitsa", "name": "kesäkurpitsa",
"plural_name": "zucchinis" "plural_name": "kesäkurpitsaa"
} }
} }

View File

@@ -54,7 +54,7 @@
"name": "mûres" "name": "mûres"
}, },
"bok-choy": { "bok-choy": {
"name": "bok choy" "name": "pakchoï"
}, },
"brassicas": { "brassicas": {
"name": "crucifères" "name": "crucifères"
@@ -100,7 +100,7 @@
"name": "cactus, comestible" "name": "cactus, comestible"
}, },
"calabrese": { "calabrese": {
"name": "calabrese" "name": "brocoli calabrese"
}, },
"cane-sugar": { "cane-sugar": {
"name": "sucre de canne" "name": "sucre de canne"

View File

@@ -221,7 +221,7 @@
}, },
"daikon": { "daikon": {
"name": "rzodkiew japońska", "name": "rzodkiew japońska",
"plural_name": "daikons" "plural_name": "rzodkwie japońskie"
}, },
"dairy-products-and-dairy-substitutes": { "dairy-products-and-dairy-substitutes": {
"name": "przetwory i substytuty mleczne" "name": "przetwory i substytuty mleczne"
@@ -321,7 +321,7 @@
}, },
"heart-of-palm": { "heart-of-palm": {
"name": "serce palmy", "name": "serce palmy",
"plural_name": "heart of palms" "plural_name": "serca palm"
}, },
"hemp": { "hemp": {
"name": "konopia" "name": "konopia"

View File

@@ -10,7 +10,7 @@
}, },
"apples": { "apples": {
"name": "maçãs", "name": "maçãs",
"plural_name": "apples" "plural_name": "maçãs"
}, },
"artichoke": { "artichoke": {
"name": "alcachofra" "name": "alcachofra"
@@ -48,7 +48,7 @@
}, },
"bell-peppers": { "bell-peppers": {
"name": "pimentões", "name": "pimentões",
"plural_name": "bell peppers" "plural_name": "pimentões"
}, },
"blackberries": { "blackberries": {
"name": "amoras silvestres" "name": "amoras silvestres"
@@ -94,7 +94,7 @@
}, },
"cabbage": { "cabbage": {
"name": "repolho", "name": "repolho",
"plural_name": "cabbages" "plural_name": "repolhos"
}, },
"cactus-edible": { "cactus-edible": {
"name": "cacto, comestível" "name": "cacto, comestível"
@@ -116,7 +116,7 @@
}, },
"carrot": { "carrot": {
"name": "cenoura", "name": "cenoura",
"plural_name": "carrots" "plural_name": "cenouras"
}, },
"caster-sugar": { "caster-sugar": {
"name": "açúcar refinado" "name": "açúcar refinado"
@@ -129,7 +129,7 @@
}, },
"cauliflower": { "cauliflower": {
"name": "couve-flor", "name": "couve-flor",
"plural_name": "cauliflowers" "plural_name": "couve-flor"
}, },
"cayenne-pepper": { "cayenne-pepper": {
"name": "pimenta caiena" "name": "pimenta caiena"
@@ -154,7 +154,7 @@
}, },
"chilli-peppers": { "chilli-peppers": {
"name": "pimenta picante", "name": "pimenta picante",
"plural_name": "chilli peppers" "plural_name": "pimenta em pó"
}, },
"chinese-leaves": { "chinese-leaves": {
"name": "couve-china" "name": "couve-china"
@@ -176,7 +176,7 @@
}, },
"coconut": { "coconut": {
"name": "coco", "name": "coco",
"plural_name": "coconuts" "plural_name": "cocos"
}, },
"coconut-milk": { "coconut-milk": {
"name": "leite de coco" "name": "leite de coco"
@@ -198,7 +198,7 @@
}, },
"corn": { "corn": {
"name": "milho", "name": "milho",
"plural_name": "corns" "plural_name": "milhos"
}, },
"corn-syrup": { "corn-syrup": {
"name": "xarope de milho" "name": "xarope de milho"
@@ -214,14 +214,14 @@
}, },
"cucumber": { "cucumber": {
"name": "pepino", "name": "pepino",
"plural_name": "cucumbers" "plural_name": "pepinos"
}, },
"cumin": { "cumin": {
"name": "cominho" "name": "cominho"
}, },
"daikon": { "daikon": {
"name": "rabanete", "name": "rabanete",
"plural_name": "daikons" "plural_name": "rabanetes"
}, },
"dairy-products-and-dairy-substitutes": { "dairy-products-and-dairy-substitutes": {
"name": "produtos lácteos e substitutos de leite" "name": "produtos lácteos e substitutos de leite"
@@ -240,15 +240,15 @@
}, },
"eggplant": { "eggplant": {
"name": "berinjela", "name": "berinjela",
"plural_name": "eggplants" "plural_name": "berinjelas"
}, },
"eggs": { "eggs": {
"name": "ovos", "name": "ovos",
"plural_name": "eggs" "plural_name": "ovos"
}, },
"endive": { "endive": {
"name": "endívia", "name": "endívia",
"plural_name": "endives" "plural_name": "endívias"
}, },
"fats": { "fats": {
"name": "gorduras" "name": "gorduras"
@@ -292,7 +292,7 @@
}, },
"garlic": { "garlic": {
"name": "alho", "name": "alho",
"plural_name": "garlics" "plural_name": "alhos"
}, },
"gem-squash": { "gem-squash": {
"name": "abóbora coroa" "name": "abóbora coroa"
@@ -317,11 +317,11 @@
}, },
"green-onion": { "green-onion": {
"name": "Cebola Verde", "name": "Cebola Verde",
"plural_name": "green onions" "plural_name": "cebolinha"
}, },
"heart-of-palm": { "heart-of-palm": {
"name": "palmito", "name": "palmito",
"plural_name": "heart of palms" "plural_name": "palmito"
}, },
"hemp": { "hemp": {
"name": "cânhamo" "name": "cânhamo"
@@ -337,7 +337,7 @@
}, },
"jackfruit": { "jackfruit": {
"name": "jaca", "name": "jaca",
"plural_name": "jackfruits" "plural_name": "jaca"
}, },
"jaggery": { "jaggery": {
"name": "açúcar mascavo" "name": "açúcar mascavo"
@@ -368,7 +368,7 @@
}, },
"leek": { "leek": {
"name": "alho-porró", "name": "alho-porró",
"plural_name": "leeks" "plural_name": "alhos-porró"
}, },
"legumes": { "legumes": {
"name": "leguminosas" "name": "leguminosas"
@@ -384,7 +384,7 @@
}, },
"liver": { "liver": {
"name": "fígado", "name": "fígado",
"plural_name": "livers" "plural_name": "fígados"
}, },
"maize": { "maize": {
"name": "milho" "name": "milho"
@@ -403,7 +403,7 @@
}, },
"mushroom": { "mushroom": {
"name": "cogumelo", "name": "cogumelo",
"plural_name": "mushrooms" "plural_name": "cogumelos"
}, },
"mussels": { "mussels": {
"name": "mexilhões" "name": "mexilhões"
@@ -425,7 +425,7 @@
}, },
"octopuses": { "octopuses": {
"name": "polvos", "name": "polvos",
"plural_name": "octopuses" "plural_name": "polvos"
}, },
"oils": { "oils": {
"name": "óleos" "name": "óleos"
@@ -450,7 +450,7 @@
}, },
"oranges": { "oranges": {
"name": "laranjas", "name": "laranjas",
"plural_name": "oranges" "plural_name": "laranjas"
}, },
"oregano": { "oregano": {
"name": "orégano" "name": "orégano"
@@ -473,29 +473,29 @@
}, },
"pear": { "pear": {
"name": "pêra", "name": "pêra",
"plural_name": "pears" "plural_name": "peras"
}, },
"peas": { "peas": {
"name": "ervilha" "name": "ervilha"
}, },
"pepper": { "pepper": {
"name": "pimenta", "name": "pimenta",
"plural_name": "peppers" "plural_name": "pimentas"
}, },
"pineapple": { "pineapple": {
"name": "abacaxi", "name": "abacaxi",
"plural_name": "pineapples" "plural_name": "abacaxis"
}, },
"plantain": { "plantain": {
"name": "banana-da-terra", "name": "banana-da-terra",
"plural_name": "plantains" "plural_name": "bananas-da-terra"
}, },
"poppy-seeds": { "poppy-seeds": {
"name": "sementes de papoula" "name": "sementes de papoula"
}, },
"potato": { "potato": {
"name": "batata", "name": "batata",
"plural_name": "potatoes" "plural_name": "batatas"
}, },
"poultry": { "poultry": {
"name": "carne de frango" "name": "carne de frango"
@@ -505,14 +505,14 @@
}, },
"pumpkin": { "pumpkin": {
"name": "abóbora", "name": "abóbora",
"plural_name": "pumpkins" "plural_name": "abóboras"
}, },
"pumpkin-seeds": { "pumpkin-seeds": {
"name": "sementes de abóbora" "name": "sementes de abóbora"
}, },
"radish": { "radish": {
"name": "rabanete", "name": "rabanete",
"plural_name": "radishes" "plural_name": "rabanetes"
}, },
"raw-sugar": { "raw-sugar": {
"name": "açúcar mascavo" "name": "açúcar mascavo"
@@ -543,7 +543,7 @@
}, },
"scallion": { "scallion": {
"name": "cebolinha", "name": "cebolinha",
"plural_name": "scallions" "plural_name": "cebolinhas"
}, },
"seafood": { "seafood": {
"name": "frutos do mar" "name": "frutos do mar"
@@ -556,7 +556,7 @@
}, },
"shallot": { "shallot": {
"name": "chalota", "name": "chalota",
"plural_name": "shallots" "plural_name": "chalota"
}, },
"skate": { "skate": {
"name": "raia" "name": "raia"

View File

@@ -261,7 +261,7 @@
}, },
"fiddlehead-fern": { "fiddlehead-fern": {
"name": "побеги папоротника", "name": "побеги папоротника",
"plural_name": "fiddlehead ferns" "plural_name": "побеги папоротника"
}, },
"fish": { "fish": {
"name": "рыба" "name": "рыба"
@@ -337,7 +337,7 @@
}, },
"jackfruit": { "jackfruit": {
"name": "джекфрут", "name": "джекфрут",
"plural_name": "jackfruits" "plural_name": "джекфрут"
}, },
"jaggery": { "jaggery": {
"name": "джаггери" "name": "джаггери"
@@ -469,7 +469,7 @@
}, },
"parsnip": { "parsnip": {
"name": "пастернак", "name": "пастернак",
"plural_name": "parsnips" "plural_name": "пастернак"
}, },
"pear": { "pear": {
"name": "груша", "name": "груша",
@@ -512,7 +512,7 @@
}, },
"radish": { "radish": {
"name": "редис", "name": "редис",
"plural_name": "radishes" "plural_name": "редис"
}, },
"raw-sugar": { "raw-sugar": {
"name": "нерафинированный сахар" "name": "нерафинированный сахар"
@@ -585,11 +585,11 @@
}, },
"spring-onion": { "spring-onion": {
"name": "зелёный лук", "name": "зелёный лук",
"plural_name": "spring onions" "plural_name": "зелёный лук"
}, },
"squash": { "squash": {
"name": "тыква", "name": "тыква",
"plural_name": "squashes" "plural_name": "кабачки"
}, },
"squash-family": { "squash-family": {
"name": "тыквы" "name": "тыквы"
@@ -640,7 +640,7 @@
}, },
"tubers": { "tubers": {
"name": "клубни", "name": "клубни",
"plural_name": "tubers" "plural_name": "клубни"
}, },
"tuna": { "tuna": {
"name": "тунец" "name": "тунец"
@@ -650,7 +650,7 @@
}, },
"turnip": { "turnip": {
"name": "репа", "name": "репа",
"plural_name": "turnips" "plural_name": "репа"
}, },
"unrefined-sugar": { "unrefined-sugar": {
"name": "нерафинированный сахар" "name": "нерафинированный сахар"
@@ -666,7 +666,7 @@
}, },
"watermelon": { "watermelon": {
"name": "арбуз", "name": "арбуз",
"plural_name": "watermelons" "plural_name": "арбузы"
}, },
"white-mushroom": { "white-mushroom": {
"name": "белый гриб", "name": "белый гриб",
@@ -687,6 +687,6 @@
}, },
"zucchini": { "zucchini": {
"name": "цуккини", "name": "цуккини",
"plural_name": "zucchinis" "plural_name": "цуккини"
} }
} }

View File

@@ -1,9 +1,9 @@
[ [
{ {
"name": "Tuote" "name": "HeVi"
}, },
{ {
"name": "Vilja" "name": "Viljat"
}, },
{ {
"name": "Hedelmät" "name": "Hedelmät"
@@ -21,16 +21,16 @@
"name": "Juomat" "name": "Juomat"
}, },
{ {
"name": "Paistetut" "name": "Leivonnaiset"
}, },
{ {
"name": "Tölkitetyt" "name": "Säilykkeet"
}, },
{ {
"name": "Mausteet" "name": "Maustekastikkeet"
}, },
{ {
"name": "Makeiset" "name": "Konditoriatuotteet"
}, },
{ {
"name": "Maitotuotteet" "name": "Maitotuotteet"
@@ -39,16 +39,16 @@
"name": "Pakasteet" "name": "Pakasteet"
}, },
{ {
"name": "Terveelliset" "name": "Terveysruoka"
}, },
{ {
"name": "Kotitaloudet" "name": "Kotitalous"
}, },
{ {
"name": "Lihatuotteet" "name": "Lihatuotteet"
}, },
{ {
"name": "Pienpurtavat" "name": "Välipalat"
}, },
{ {
"name": "Mausteet" "name": "Mausteet"

View File

@@ -15,7 +15,7 @@
"name": "šálek", "name": "šálek",
"plural_name": "šálků", "plural_name": "šálků",
"description": "", "description": "",
"abbreviation": "c" "abbreviation": "š"
}, },
"fluid-ounce": { "fluid-ounce": {
"name": "dutá unce", "name": "dutá unce",
@@ -31,7 +31,7 @@
}, },
"quart": { "quart": {
"name": "čtvrtka", "name": "čtvrtka",
"plural_name": "quarts", "plural_name": "čtvrtky",
"description": "", "description": "",
"abbreviation": "čtvrtka" "abbreviation": "čtvrtka"
}, },
@@ -92,7 +92,7 @@
}, },
"dash": { "dash": {
"name": "špetka", "name": "špetka",
"plural_name": "dashes", "plural_name": "špetky",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
}, },
@@ -127,8 +127,8 @@
"abbreviation": "" "abbreviation": ""
}, },
"pack": { "pack": {
"name": "pack", "name": "balení",
"plural_name": "packs", "plural_name": "balení",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
}, },

View File

@@ -73,8 +73,8 @@
"abbreviation": "g" "abbreviation": "g"
}, },
"kilogram": { "kilogram": {
"name": "kilogam", "name": "kilogram",
"plural_name": "kilogam", "plural_name": "kilogram",
"description": "", "description": "",
"abbreviation": "kg" "abbreviation": "kg"
}, },
@@ -97,7 +97,7 @@
"abbreviation": "" "abbreviation": ""
}, },
"serving": { "serving": {
"name": "servering", "name": "portion",
"plural_name": "portioner", "plural_name": "portioner",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""

View File

@@ -1,140 +1,140 @@
{ {
"teaspoon": { "teaspoon": {
"name": "teelusikka", "name": "teelusikallinen",
"plural_name": "teaspoons", "plural_name": "teelusikallista",
"description": "", "description": "",
"abbreviation": "tl" "abbreviation": "tl"
}, },
"tablespoon": { "tablespoon": {
"name": "ruokalusikka", "name": "ruokalusikallinen",
"plural_name": "tablespoons", "plural_name": "ruokalusikallista",
"description": "", "description": "",
"abbreviation": "rkl" "abbreviation": "rkl"
}, },
"cup": { "cup": {
"name": "kuppi", "name": "kupillinen",
"plural_name": "cups", "plural_name": "kupillista",
"description": "", "description": "",
"abbreviation": "c" "abbreviation": "k"
}, },
"fluid-ounce": { "fluid-ounce": {
"name": "nesteunssi", "name": "nesteunssi",
"plural_name": "fluid ounces", "plural_name": "nesteunssia",
"description": "", "description": "",
"abbreviation": "fl oz" "abbreviation": "fl oz"
}, },
"pint": { "pint": {
"name": "tuoppi", "name": "pintti",
"plural_name": "pints", "plural_name": "pinttiä",
"description": "", "description": "",
"abbreviation": "pt" "abbreviation": "pt"
}, },
"quart": { "quart": {
"name": "kvartti", "name": "vartti",
"plural_name": "quarts", "plural_name": "varttia",
"description": "", "description": "",
"abbreviation": "qt" "abbreviation": "qt"
}, },
"gallon": { "gallon": {
"name": "gallona", "name": "gallona",
"plural_name": "gallons", "plural_name": "gallonaa",
"description": "", "description": "",
"abbreviation": "gal" "abbreviation": "gal"
}, },
"milliliter": { "milliliter": {
"name": "millilitra", "name": "millilitra",
"plural_name": "milliliters", "plural_name": "millilitraa",
"description": "", "description": "",
"abbreviation": "ml" "abbreviation": "ml"
}, },
"liter": { "liter": {
"name": "litra", "name": "litra",
"plural_name": "liters", "plural_name": "litraa",
"description": "", "description": "",
"abbreviation": "l" "abbreviation": "l"
}, },
"pound": { "pound": {
"name": "pauna", "name": "pauna",
"plural_name": "pounds", "plural_name": "paunaa",
"description": "", "description": "",
"abbreviation": "lb", "abbreviation": "lb",
"plural_abbreviation": "lbs" "plural_abbreviation": "lbs"
}, },
"ounce": { "ounce": {
"name": "unssi", "name": "unssi",
"plural_name": "ounces", "plural_name": "unssia",
"description": "", "description": "",
"abbreviation": "oz" "abbreviation": "oz"
}, },
"gram": { "gram": {
"name": "gramma", "name": "gramma",
"plural_name": "grams", "plural_name": "grammaa",
"description": "", "description": "",
"abbreviation": "g" "abbreviation": "g"
}, },
"kilogram": { "kilogram": {
"name": "kilogramma", "name": "kilogramma",
"plural_name": "kilograms", "plural_name": "kilogrammaa",
"description": "", "description": "",
"abbreviation": "kg" "abbreviation": "kg"
}, },
"milligram": { "milligram": {
"name": "milligramma", "name": "milligramma",
"plural_name": "milligrams", "plural_name": "milligrammaa",
"description": "", "description": "",
"abbreviation": "mg" "abbreviation": "mg"
}, },
"splash": { "splash": {
"name": "tilkka", "name": "tilkka",
"plural_name": "splashes", "plural_name": "tilkkaa",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
}, },
"dash": { "dash": {
"name": "ripaus", "name": "ripaus",
"plural_name": "dashes", "plural_name": "ripausta",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
}, },
"serving": { "serving": {
"name": "annos", "name": "annos",
"plural_name": "servings", "plural_name": "annosta",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
}, },
"head": { "head": {
"name": "pää", "name": "pää",
"plural_name": "heads", "plural_name": "päätä",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
}, },
"clove": { "clove": {
"name": "kynsi", "name": "kynsi",
"plural_name": "cloves", "plural_name": "kynttä",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
}, },
"can": { "can": {
"name": "tölkki", "name": "tölkillinen",
"plural_name": "cans", "plural_name": "tölkillistä",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
}, },
"bunch": { "bunch": {
"name": "bunch", "name": "nippu",
"plural_name": "bunches", "plural_name": "nippua",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
}, },
"pack": { "pack": {
"name": "pack", "name": "pakkaus",
"plural_name": "packs", "plural_name": "pakkausta",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
}, },
"pinch": { "pinch": {
"name": "pinch", "name": "hyppysellinen",
"plural_name": "pinches", "plural_name": "hyppysellistä",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
} }

View File

@@ -49,7 +49,7 @@
}, },
"liter": { "liter": {
"name": "litras", "name": "litras",
"plural_name": "liters", "plural_name": "lit",
"description": "", "description": "",
"abbreviation": "l" "abbreviation": "l"
}, },
@@ -68,19 +68,19 @@
}, },
"gram": { "gram": {
"name": "gramas", "name": "gramas",
"plural_name": "grams", "plural_name": "gramų",
"description": "", "description": "",
"abbreviation": "g" "abbreviation": "g"
}, },
"kilogram": { "kilogram": {
"name": "kilogramas", "name": "kilogramas",
"plural_name": "kilograms", "plural_name": "kilogramų",
"description": "", "description": "",
"abbreviation": "kg" "abbreviation": "kg"
}, },
"milligram": { "milligram": {
"name": "miligramas", "name": "miligramas",
"plural_name": "milligrams", "plural_name": "miligramų",
"description": "", "description": "",
"abbreviation": "mg" "abbreviation": "mg"
}, },
@@ -98,7 +98,7 @@
}, },
"serving": { "serving": {
"name": "porcijos", "name": "porcijos",
"plural_name": "servings", "plural_name": "porcijų",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
}, },

View File

@@ -104,13 +104,13 @@
}, },
"head": { "head": {
"name": "cabeça", "name": "cabeça",
"plural_name": "heads", "plural_name": "cabeças",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
}, },
"clove": { "clove": {
"name": "cravo", "name": "cravo",
"plural_name": "cloves", "plural_name": "cravos",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
}, },
@@ -127,8 +127,8 @@
"abbreviation": "" "abbreviation": ""
}, },
"pack": { "pack": {
"name": "pack", "name": "pacote",
"plural_name": "packs", "plural_name": "pacotes",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
}, },

View File

@@ -5,14 +5,20 @@ from fastapi import HTTPException, status
from mealie.core.security import create_access_token from mealie.core.security import create_access_token
from mealie.routes._base import BaseUserController, controller from mealie.routes._base import BaseUserController, controller
from mealie.routes._base.routers import UserAPIRouter from mealie.routes._base.routers import UserAPIRouter
from mealie.schema.user import CreateToken, DeleteTokenResponse, LongLiveTokenIn, LongLiveTokenInDB, LongLiveTokenOut from mealie.schema.user import (
CreateToken,
DeleteTokenResponse,
LongLiveTokenCreateResponse,
LongLiveTokenIn,
LongLiveTokenInDB,
)
router = UserAPIRouter(prefix="/users", tags=["Users: Tokens"]) router = UserAPIRouter(prefix="/users", tags=["Users: Tokens"])
@controller(router) @controller(router)
class UserApiTokensController(BaseUserController): class UserApiTokensController(BaseUserController):
@router.post("/api-tokens", status_code=status.HTTP_201_CREATED, response_model=LongLiveTokenOut) @router.post("/api-tokens", status_code=status.HTTP_201_CREATED, response_model=LongLiveTokenCreateResponse)
def create_api_token( def create_api_token(
self, self,
token_params: LongLiveTokenIn, token_params: LongLiveTokenIn,

View File

@@ -10,6 +10,7 @@ from .user import (
GroupInDB, GroupInDB,
GroupPagination, GroupPagination,
GroupSummary, GroupSummary,
LongLiveTokenCreateResponse,
LongLiveTokenIn, LongLiveTokenIn,
LongLiveTokenInDB, LongLiveTokenInDB,
LongLiveTokenOut, LongLiveTokenOut,
@@ -57,6 +58,7 @@ __all__ = [
"GroupInDB", "GroupInDB",
"GroupPagination", "GroupPagination",
"GroupSummary", "GroupSummary",
"LongLiveTokenCreateResponse",
"LongLiveTokenIn", "LongLiveTokenIn",
"LongLiveTokenInDB", "LongLiveTokenInDB",
"LongLiveTokenOut", "LongLiveTokenOut",

View File

@@ -31,7 +31,6 @@ class LongLiveTokenIn(MealieModel):
class LongLiveTokenOut(MealieModel): class LongLiveTokenOut(MealieModel):
token: str
name: str name: str
id: int id: int
created_at: datetime | None = None created_at: datetime | None = None
@@ -42,6 +41,12 @@ class LongLiveTokenOut(MealieModel):
return [joinedload(LongLiveToken.user)] return [joinedload(LongLiveToken.user)]
class LongLiveTokenCreateResponse(LongLiveTokenOut):
"""Should ONLY be used when creating a new token, as the token field is sensitive"""
token: str
class CreateToken(LongLiveTokenIn): class CreateToken(LongLiveTokenIn):
user_id: UUID4 user_id: UUID4
token: str token: str

334
poetry.lock generated
View File

@@ -118,13 +118,13 @@ files = [
[[package]] [[package]]
name = "authlib" name = "authlib"
version = "1.4.0" version = "1.4.1"
description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients."
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
files = [ files = [
{file = "Authlib-1.4.0-py2.py3-none-any.whl", hash = "sha256:4bb20b978c8b636222b549317c1815e1fe62234fc1c5efe8855d84aebf3a74e3"}, {file = "Authlib-1.4.1-py2.py3-none-any.whl", hash = "sha256:edc29c3f6a3e72cd9e9f45fff67fc663a2c364022eb0371c003f22d5405915c1"},
{file = "authlib-1.4.0.tar.gz", hash = "sha256:1c1e6608b5ed3624aeeee136ca7f8c120d6f51f731aa152b153d54741840e1f2"}, {file = "authlib-1.4.1.tar.gz", hash = "sha256:30ead9ea4993cdbab821dc6e01e818362f92da290c04c7f6a1940f86507a790d"},
] ]
[package.dependencies] [package.dependencies]
@@ -607,23 +607,23 @@ cli = ["requests"]
[[package]] [[package]]
name = "fastapi" name = "fastapi"
version = "0.115.6" version = "0.115.8"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "fastapi-0.115.6-py3-none-any.whl", hash = "sha256:e9240b29e36fa8f4bb7290316988e90c381e5092e0cbe84e7818cc3713bcf305"}, {file = "fastapi-0.115.8-py3-none-any.whl", hash = "sha256:753a96dd7e036b34eeef8babdfcfe3f28ff79648f86551eb36bfc1b0bf4a8cbf"},
{file = "fastapi-0.115.6.tar.gz", hash = "sha256:9ec46f7addc14ea472958a96aae5b5de65f39721a46aaf5705c480d9a8b76654"}, {file = "fastapi-0.115.8.tar.gz", hash = "sha256:0ce9111231720190473e222cdf0f07f7206ad7e53ea02beb1d2dc36e2f0741e9"},
] ]
[package.dependencies] [package.dependencies]
pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0"
starlette = ">=0.40.0,<0.42.0" starlette = ">=0.40.0,<0.46.0"
typing-extensions = ">=4.8.0" typing-extensions = ">=4.8.0"
[package.extras] [package.extras]
all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=2.11.2)", "python-multipart (>=0.0.7)", "uvicorn[standard] (>=0.12.0)"] standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"]
[[package]] [[package]]
name = "filelock" name = "filelock"
@@ -1451,13 +1451,13 @@ pyyaml = ">=5.1"
[[package]] [[package]]
name = "mkdocs-material" name = "mkdocs-material"
version = "9.5.50" version = "9.6.2"
description = "Documentation that simply works" description = "Documentation that simply works"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "mkdocs_material-9.5.50-py3-none-any.whl", hash = "sha256:f24100f234741f4d423a9d672a909d859668a4f404796be3cf035f10d6050385"}, {file = "mkdocs_material-9.6.2-py3-none-any.whl", hash = "sha256:71d90dbd63b393ad11a4d90151dfe3dcbfcd802c0f29ce80bebd9bbac6abc753"},
{file = "mkdocs_material-9.5.50.tar.gz", hash = "sha256:ae5fe16f3d7c9ccd05bb6916a7da7420cf99a9ce5e33debd9d40403a090d5825"}, {file = "mkdocs_material-9.6.2.tar.gz", hash = "sha256:a3de1c5d4c745f10afa78b1a02f917b9dce0808fb206adc0f5bb48b58c1ca21f"},
] ]
[package.dependencies] [package.dependencies]
@@ -1491,49 +1491,43 @@ files = [
[[package]] [[package]]
name = "mypy" name = "mypy"
version = "1.14.1" version = "1.15.0"
description = "Optional static typing for Python" description = "Optional static typing for Python"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.9"
files = [ files = [
{file = "mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb"}, {file = "mypy-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:979e4e1a006511dacf628e36fadfecbcc0160a8af6ca7dad2f5025529e082c13"},
{file = "mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0"}, {file = "mypy-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4bb0e1bd29f7d34efcccd71cf733580191e9a264a2202b0239da95984c5b559"},
{file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d"}, {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be68172e9fd9ad8fb876c6389f16d1c1b5f100ffa779f77b1fb2176fcc9ab95b"},
{file = "mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b"}, {file = "mypy-1.15.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7be1e46525adfa0d97681432ee9fcd61a3964c2446795714699a998d193f1a3"},
{file = "mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427"}, {file = "mypy-1.15.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2e2c2e6d3593f6451b18588848e66260ff62ccca522dd231cd4dd59b0160668b"},
{file = "mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f"}, {file = "mypy-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:6983aae8b2f653e098edb77f893f7b6aca69f6cffb19b2cc7443f23cce5f4828"},
{file = "mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c"}, {file = "mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f"},
{file = "mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1"}, {file = "mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5"},
{file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8"}, {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e"},
{file = "mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f"}, {file = "mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c"},
{file = "mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1"}, {file = "mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f"},
{file = "mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae"}, {file = "mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f"},
{file = "mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14"}, {file = "mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd"},
{file = "mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9"}, {file = "mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f"},
{file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11"}, {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464"},
{file = "mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e"}, {file = "mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee"},
{file = "mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89"}, {file = "mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e"},
{file = "mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b"}, {file = "mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22"},
{file = "mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255"}, {file = "mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445"},
{file = "mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34"}, {file = "mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d"},
{file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a"}, {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5"},
{file = "mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9"}, {file = "mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036"},
{file = "mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd"}, {file = "mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357"},
{file = "mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107"}, {file = "mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf"},
{file = "mypy-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7084fb8f1128c76cd9cf68fe5971b37072598e7c31b2f9f95586b65c741a9d31"}, {file = "mypy-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e601a7fa172c2131bff456bb3ee08a88360760d0d2f8cbd7a75a65497e2df078"},
{file = "mypy-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8f845a00b4f420f693f870eaee5f3e2692fa84cc8514496114649cfa8fd5e2c6"}, {file = "mypy-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:712e962a6357634fef20412699a3655c610110e01cdaa6180acec7fc9f8513ba"},
{file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44bf464499f0e3a2d14d58b54674dee25c031703b2ffc35064bd0df2e0fac319"}, {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95579473af29ab73a10bada2f9722856792a36ec5af5399b653aa28360290a5"},
{file = "mypy-1.14.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c99f27732c0b7dc847adb21c9d47ce57eb48fa33a17bc6d7d5c5e9f9e7ae5bac"}, {file = "mypy-1.15.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f8722560a14cde92fdb1e31597760dc35f9f5524cce17836c0d22841830fd5b"},
{file = "mypy-1.14.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bce23c7377b43602baa0bd22ea3265c49b9ff0b76eb315d6c34721af4cdf1d9b"}, {file = "mypy-1.15.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1fbb8da62dc352133d7d7ca90ed2fb0e9d42bb1a32724c287d3c76c58cbaa9c2"},
{file = "mypy-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:8edc07eeade7ebc771ff9cf6b211b9a7d93687ff892150cb5692e4f4272b0837"}, {file = "mypy-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:d10d994b41fb3497719bbf866f227b3489048ea4bbbb5015357db306249f7980"},
{file = "mypy-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3888a1816d69f7ab92092f785a462944b3ca16d7c470d564165fe703b0970c35"}, {file = "mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e"},
{file = "mypy-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46c756a444117c43ee984bd055db99e498bc613a70bbbc120272bd13ca579fbc"}, {file = "mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43"},
{file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27fc248022907e72abfd8e22ab1f10e903915ff69961174784a3900a8cba9ad9"},
{file = "mypy-1.14.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:499d6a72fb7e5de92218db961f1a66d5f11783f9ae549d214617edab5d4dbdbb"},
{file = "mypy-1.14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57961db9795eb566dc1d1b4e9139ebc4c6b0cb6e7254ecde69d1552bf7613f60"},
{file = "mypy-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:07ba89fdcc9451f2ebb02853deb6aaaa3d2239a236669a63ab3801bbf923ef5c"},
{file = "mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1"},
{file = "mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6"},
] ]
[package.dependencies] [package.dependencies]
@@ -1590,13 +1584,13 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"]
[[package]] [[package]]
name = "openai" name = "openai"
version = "1.60.0" version = "1.61.1"
description = "The official Python library for the openai API" description = "The official Python library for the openai API"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "openai-1.60.0-py3-none-any.whl", hash = "sha256:df06c43be8018274980ac363da07d4b417bd835ead1c66e14396f6f15a0d5dda"}, {file = "openai-1.61.1-py3-none-any.whl", hash = "sha256:72b0826240ce26026ac2cd17951691f046e5be82ad122d20a8e1b30ca18bd11e"},
{file = "openai-1.60.0.tar.gz", hash = "sha256:7fa536cd4b644718645b874d2706e36dbbef38b327e42ca0623275da347ee1a9"}, {file = "openai-1.61.1.tar.gz", hash = "sha256:ce1851507218209961f89f3520e06726c0aa7d0512386f0f977e3ac3e4f2472e"},
] ]
[package.dependencies] [package.dependencies]
@@ -2274,20 +2268,20 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"]
[[package]] [[package]]
name = "pylint" name = "pylint"
version = "3.3.3" version = "3.3.4"
description = "python code static checker" description = "python code static checker"
optional = false optional = false
python-versions = ">=3.9.0" python-versions = ">=3.9.0"
files = [ files = [
{file = "pylint-3.3.3-py3-none-any.whl", hash = "sha256:26e271a2bc8bce0fc23833805a9076dd9b4d5194e2a02164942cb3cdc37b4183"}, {file = "pylint-3.3.4-py3-none-any.whl", hash = "sha256:289e6a1eb27b453b08436478391a48cd53bb0efb824873f949e709350f3de018"},
{file = "pylint-3.3.3.tar.gz", hash = "sha256:07c607523b17e6d16e2ae0d7ef59602e332caa762af64203c24b41c27139f36a"}, {file = "pylint-3.3.4.tar.gz", hash = "sha256:74ae7a38b177e69a9b525d0794bd8183820bfa7eb68cc1bee6e8ed22a42be4ce"},
] ]
[package.dependencies] [package.dependencies]
astroid = ">=3.3.8,<=3.4.0-dev0" astroid = ">=3.3.8,<=3.4.0-dev0"
colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""}
dill = {version = ">=0.3.7", markers = "python_version >= \"3.12\""} dill = {version = ">=0.3.7", markers = "python_version >= \"3.12\""}
isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" isort = ">=4.2.5,<5.13.0 || >5.13.0,<7"
mccabe = ">=0.6,<0.8" mccabe = ">=0.6,<0.8"
platformdirs = ">=2.2.0" platformdirs = ">=2.2.0"
tomlkit = ">=0.10.1" tomlkit = ">=0.10.1"
@@ -2366,13 +2360,13 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments
[[package]] [[package]]
name = "pytest-asyncio" name = "pytest-asyncio"
version = "0.25.2" version = "0.25.3"
description = "Pytest support for asyncio" description = "Pytest support for asyncio"
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
files = [ files = [
{file = "pytest_asyncio-0.25.2-py3-none-any.whl", hash = "sha256:0d0bb693f7b99da304a0634afc0a4b19e49d5e0de2d670f38dc4bfa5727c5075"}, {file = "pytest_asyncio-0.25.3-py3-none-any.whl", hash = "sha256:9e89518e0f9bd08928f97a3482fdc4e244df17529460bc038291ccaf8f85c7c3"},
{file = "pytest_asyncio-0.25.2.tar.gz", hash = "sha256:3f8ef9a98f45948ea91a0ed3dc4268b5326c0e7bce73892acc654df4262ad45f"}, {file = "pytest_asyncio-0.25.3.tar.gz", hash = "sha256:fc1da2cf9f125ada7e710b4ddad05518d4cee187ae9412e9ac9271003497f07a"},
] ]
[package.dependencies] [package.dependencies]
@@ -2530,99 +2524,99 @@ pyyaml = "*"
[[package]] [[package]]
name = "rapidfuzz" name = "rapidfuzz"
version = "3.11.0" version = "3.12.1"
description = "rapid fuzzy string matching" description = "rapid fuzzy string matching"
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
files = [ files = [
{file = "rapidfuzz-3.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eb8a54543d16ab1b69e2c5ed96cabbff16db044a50eddfc028000138ca9ddf33"}, {file = "rapidfuzz-3.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dbb7ea2fd786e6d66f225ef6eef1728832314f47e82fee877cb2a793ebda9579"},
{file = "rapidfuzz-3.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:231c8b2efbd7f8d2ecd1ae900363ba168b8870644bb8f2b5aa96e4a7573bde19"}, {file = "rapidfuzz-3.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ae41361de05762c1eaa3955e5355de7c4c6f30d1ef1ea23d29bf738a35809ab"},
{file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54e7f442fb9cca81e9df32333fb075ef729052bcabe05b0afc0441f462299114"}, {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc3c39e0317e7f68ba01bac056e210dd13c7a0abf823e7b6a5fe7e451ddfc496"},
{file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:906f1f2a1b91c06599b3dd1be207449c5d4fc7bd1e1fa2f6aef161ea6223f165"}, {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69f2520296f1ae1165b724a3aad28c56fd0ac7dd2e4cff101a5d986e840f02d4"},
{file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed59044aea9eb6c663112170f2399b040d5d7b162828b141f2673e822093fa8"}, {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34dcbf5a7daecebc242f72e2500665f0bde9dd11b779246c6d64d106a7d57c99"},
{file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cb1965a28b0fa64abdee130c788a0bc0bb3cf9ef7e3a70bf055c086c14a3d7e"}, {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:773ab37fccf6e0513891f8eb4393961ddd1053c6eb7e62eaa876e94668fc6d31"},
{file = "rapidfuzz-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b488b244931d0291412917e6e46ee9f6a14376625e150056fe7c4426ef28225"}, {file = "rapidfuzz-3.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ecf0e6de84c0bc2c0f48bc03ba23cef2c5f1245db7b26bc860c11c6fd7a097c"},
{file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f0ba13557fec9d5ffc0a22826754a7457cc77f1b25145be10b7bb1d143ce84c6"}, {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4dc2ebad4adb29d84a661f6a42494df48ad2b72993ff43fad2b9794804f91e45"},
{file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3871fa7dfcef00bad3c7e8ae8d8fd58089bad6fb21f608d2bf42832267ca9663"}, {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8389d98b9f54cb4f8a95f1fa34bf0ceee639e919807bb931ca479c7a5f2930bf"},
{file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:b2669eafee38c5884a6e7cc9769d25c19428549dcdf57de8541cf9e82822e7db"}, {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:165bcdecbfed9978962da1d3ec9c191b2ff9f1ccc2668fbaf0613a975b9aa326"},
{file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ffa1bb0e26297b0f22881b219ffc82a33a3c84ce6174a9d69406239b14575bd5"}, {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:129d536740ab0048c1a06ccff73c683f282a2347c68069affae8dbc423a37c50"},
{file = "rapidfuzz-3.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:45b15b8a118856ac9caac6877f70f38b8a0d310475d50bc814698659eabc1cdb"}, {file = "rapidfuzz-3.12.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1b67e390261ffe98ec86c771b89425a78b60ccb610c3b5874660216fcdbded4b"},
{file = "rapidfuzz-3.11.0-cp310-cp310-win32.whl", hash = "sha256:22033677982b9c4c49676f215b794b0404073f8974f98739cb7234e4a9ade9ad"}, {file = "rapidfuzz-3.12.1-cp310-cp310-win32.whl", hash = "sha256:a66520180d3426b9dc2f8d312f38e19bc1fc5601f374bae5c916f53fa3534a7d"},
{file = "rapidfuzz-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:be15496e7244361ff0efcd86e52559bacda9cd975eccf19426a0025f9547c792"}, {file = "rapidfuzz-3.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:82260b20bc7a76556cecb0c063c87dad19246a570425d38f8107b8404ca3ac97"},
{file = "rapidfuzz-3.11.0-cp310-cp310-win_arm64.whl", hash = "sha256:714a7ba31ba46b64d30fccfe95f8013ea41a2e6237ba11a805a27cdd3bce2573"}, {file = "rapidfuzz-3.12.1-cp310-cp310-win_arm64.whl", hash = "sha256:3a860d103bbb25c69c2e995fdf4fac8cb9f77fb69ec0a00469d7fd87ff148f46"},
{file = "rapidfuzz-3.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8724a978f8af7059c5323d523870bf272a097478e1471295511cf58b2642ff83"}, {file = "rapidfuzz-3.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d9afad7b16d01c9e8929b6a205a18163c7e61b6cd9bcf9c81be77d5afc1067a"},
{file = "rapidfuzz-3.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8b63cb1f2eb371ef20fb155e95efd96e060147bdd4ab9fc400c97325dfee9fe1"}, {file = "rapidfuzz-3.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bb424ae7240f2d2f7d8dda66a61ebf603f74d92f109452c63b0dbf400204a437"},
{file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82497f244aac10b20710448645f347d862364cc4f7d8b9ba14bd66b5ce4dec18"}, {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42149e6d13bd6d06437d2a954dae2184dadbbdec0fdb82dafe92860d99f80519"},
{file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:339607394941801e6e3f6c1ecd413a36e18454e7136ed1161388de674f47f9d9"}, {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:760ac95d788f2964b73da01e0bdffbe1bf2ad8273d0437565ce9092ae6ad1fbc"},
{file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84819390a36d6166cec706b9d8f0941f115f700b7faecab5a7e22fc367408bc3"}, {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2cf27e8e4bf7bf9d92ef04f3d2b769e91c3f30ba99208c29f5b41e77271a2614"},
{file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eea8d9e20632d68f653455265b18c35f90965e26f30d4d92f831899d6682149b"}, {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:00ceb8ff3c44ab0d6014106c71709c85dee9feedd6890eff77c814aa3798952b"},
{file = "rapidfuzz-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b659e1e2ea2784a9a397075a7fc395bfa4fe66424042161c4bcaf6e4f637b38"}, {file = "rapidfuzz-3.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b61c558574fbc093d85940c3264c08c2b857b8916f8e8f222e7b86b0bb7d12"},
{file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1315cd2a351144572e31fe3df68340d4b83ddec0af8b2e207cd32930c6acd037"}, {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:346a2d8f17224e99f9ef988606c83d809d5917d17ad00207237e0965e54f9730"},
{file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a7743cca45b4684c54407e8638f6d07b910d8d811347b9d42ff21262c7c23245"}, {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d60d1db1b7e470e71ae096b6456e20ec56b52bde6198e2dbbc5e6769fa6797dc"},
{file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:5bb636b0150daa6d3331b738f7c0f8b25eadc47f04a40e5c23c4bfb4c4e20ae3"}, {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2477da227e266f9c712f11393182c69a99d3c8007ea27f68c5afc3faf401cc43"},
{file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:42f4dd264ada7a9aa0805ea0da776dc063533917773cf2df5217f14eb4429eae"}, {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8499c7d963ddea8adb6cffac2861ee39a1053e22ca8a5ee9de1197f8dc0275a5"},
{file = "rapidfuzz-3.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:51f24cb39e64256221e6952f22545b8ce21cacd59c0d3e367225da8fc4b868d8"}, {file = "rapidfuzz-3.12.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:12802e5c4d8ae104fb6efeeb436098325ce0dca33b461c46e8df015c84fbef26"},
{file = "rapidfuzz-3.11.0-cp311-cp311-win32.whl", hash = "sha256:aaf391fb6715866bc14681c76dc0308f46877f7c06f61d62cc993b79fc3c4a2a"}, {file = "rapidfuzz-3.12.1-cp311-cp311-win32.whl", hash = "sha256:e1061311d07e7cdcffa92c9b50c2ab4192907e70ca01b2e8e1c0b6b4495faa37"},
{file = "rapidfuzz-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:ebadd5b8624d8ad503e505a99b8eb26fe3ea9f8e9c2234e805a27b269e585842"}, {file = "rapidfuzz-3.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6e4ed63e204daa863a802eec09feea5448617981ba5d150f843ad8e3ae071a4"},
{file = "rapidfuzz-3.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:d895998fec712544c13cfe833890e0226585cf0391dd3948412441d5d68a2b8c"}, {file = "rapidfuzz-3.12.1-cp311-cp311-win_arm64.whl", hash = "sha256:920733a28c3af47870835d59ca9879579f66238f10de91d2b4b3f809d1ebfc5b"},
{file = "rapidfuzz-3.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f382fec4a7891d66fb7163c90754454030bb9200a13f82ee7860b6359f3f2fa8"}, {file = "rapidfuzz-3.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f6235b57ae3faa3f85cb3f90c9fee49b21bd671b76e90fc99e8ca2bdf0b5e4a3"},
{file = "rapidfuzz-3.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dfaefe08af2a928e72344c800dcbaf6508e86a4ed481e28355e8d4b6a6a5230e"}, {file = "rapidfuzz-3.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:af4585e5812632c357fee5ab781c29f00cd06bea58f8882ff244cc4906ba6c9e"},
{file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92ebb7c12f682b5906ed98429f48a3dd80dd0f9721de30c97a01473d1a346576"}, {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5942dc4460e5030c5f9e1d4c9383de2f3564a2503fe25e13e89021bcbfea2f44"},
{file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a1b3ebc62d4bcdfdeba110944a25ab40916d5383c5e57e7c4a8dc0b6c17211a"}, {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b31ab59e1a0df5afc21f3109b6cfd77b34040dbf54f1bad3989f885cfae1e60"},
{file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c6d7fea39cb33e71de86397d38bf7ff1a6273e40367f31d05761662ffda49e4"}, {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97c885a7a480b21164f57a706418c9bbc9a496ec6da087e554424358cadde445"},
{file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99aebef8268f2bc0b445b5640fd3312e080bd17efd3fbae4486b20ac00466308"}, {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d844c0587d969ce36fbf4b7cbf0860380ffeafc9ac5e17a7cbe8abf528d07bb"},
{file = "rapidfuzz-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4469307f464ae3089acf3210b8fc279110d26d10f79e576f385a98f4429f7d97"}, {file = "rapidfuzz-3.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a93c95dce8917bf428064c64024de43ffd34ec5949dd4425780c72bd41f9d969"},
{file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:eb97c53112b593f89a90b4f6218635a9d1eea1d7f9521a3b7d24864228bbc0aa"}, {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:834f6113d538af358f39296604a1953e55f8eeffc20cb4caf82250edbb8bf679"},
{file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ef8937dae823b889c0273dfa0f0f6c46a3658ac0d851349c464d1b00e7ff4252"}, {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a940aa71a7f37d7f0daac186066bf6668d4d3b7e7ef464cb50bc7ba89eae1f51"},
{file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d95f9e9f3777b96241d8a00d6377cc9c716981d828b5091082d0fe3a2924b43e"}, {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ec9eaf73501c9a7de2c6938cb3050392e2ee0c5ca3921482acf01476b85a7226"},
{file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:b1d67d67f89e4e013a5295e7523bc34a7a96f2dba5dd812c7c8cb65d113cbf28"}, {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3c5ec360694ac14bfaeb6aea95737cf1a6cf805b5fe8ea7fd28814706c7fa838"},
{file = "rapidfuzz-3.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d994cf27e2f874069884d9bddf0864f9b90ad201fcc9cb2f5b82bacc17c8d5f2"}, {file = "rapidfuzz-3.12.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6b5e176524653ac46f1802bdd273a4b44a5f8d0054ed5013a8e8a4b72f254599"},
{file = "rapidfuzz-3.11.0-cp312-cp312-win32.whl", hash = "sha256:ba26d87fe7fcb56c4a53b549a9e0e9143f6b0df56d35fe6ad800c902447acd5b"}, {file = "rapidfuzz-3.12.1-cp312-cp312-win32.whl", hash = "sha256:6f463c6f1c42ec90e45d12a6379e18eddd5cdf74138804d8215619b6f4d31cea"},
{file = "rapidfuzz-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:b1f7efdd7b7adb32102c2fa481ad6f11923e2deb191f651274be559d56fc913b"}, {file = "rapidfuzz-3.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:b894fa2b30cd6498a29e5c470cb01c6ea898540b7e048a0342775a5000531334"},
{file = "rapidfuzz-3.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:ed78c8e94f57b44292c1a0350f580e18d3a3c5c0800e253f1583580c1b417ad2"}, {file = "rapidfuzz-3.12.1-cp312-cp312-win_arm64.whl", hash = "sha256:43bb17056c5d1332f517b888c4e57846c4b5f936ed304917eeb5c9ac85d940d4"},
{file = "rapidfuzz-3.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e60814edd0c9b511b5f377d48b9782b88cfe8be07a98f99973669299c8bb318a"}, {file = "rapidfuzz-3.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:97f824c15bc6933a31d6e3cbfa90188ba0e5043cf2b6dd342c2b90ee8b3fd47c"},
{file = "rapidfuzz-3.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f28952da055dbfe75828891cd3c9abf0984edc8640573c18b48c14c68ca5e06"}, {file = "rapidfuzz-3.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a973b3f5cabf931029a3ae4a0f72e3222e53d412ea85fc37ddc49e1774f00fbf"},
{file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e8f93bc736020351a6f8e71666e1f486bb8bd5ce8112c443a30c77bfde0eb68"}, {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7880e012228722dec1be02b9ef3898ed023388b8a24d6fa8213d7581932510"},
{file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76a4a11ba8f678c9e5876a7d465ab86def047a4fcc043617578368755d63a1bc"}, {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c78582f50e75e6c2bc38c791ed291cb89cf26a3148c47860c1a04d6e5379c8e"},
{file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc0e0d41ad8a056a9886bac91ff9d9978e54a244deb61c2972cc76b66752de9c"}, {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d7d9e6a04d8344b0198c96394c28874086888d0a2b2f605f30d1b27b9377b7d"},
{file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e8ea35f2419c7d56b3e75fbde2698766daedb374f20eea28ac9b1f668ef4f74"}, {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5620001fd4d6644a2f56880388179cc8f3767670f0670160fcb97c3b46c828af"},
{file = "rapidfuzz-3.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd340bbd025302276b5aa221dccfe43040c7babfc32f107c36ad783f2ffd8775"}, {file = "rapidfuzz-3.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0666ab4c52e500af7ba5cc17389f5d15c0cdad06412c80312088519fdc25686d"},
{file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:494eef2c68305ab75139034ea25328a04a548d297712d9cf887bf27c158c388b"}, {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:27b4d440fa50b50c515a91a01ee17e8ede719dca06eef4c0cccf1a111a4cfad3"},
{file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5a167344c1d6db06915fb0225592afdc24d8bafaaf02de07d4788ddd37f4bc2f"}, {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83dccfd5a754f2a0e8555b23dde31f0f7920601bfa807aa76829391ea81e7c67"},
{file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8c7af25bda96ac799378ac8aba54a8ece732835c7b74cfc201b688a87ed11152"}, {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b572b634740e047c53743ed27a1bb3b4f93cf4abbac258cd7af377b2c4a9ba5b"},
{file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d2a0f7e17f33e7890257367a1662b05fecaf56625f7dbb6446227aaa2b86448b"}, {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7fa7b81fb52902d5f78dac42b3d6c835a6633b01ddf9b202a3ca8443be4b2d6a"},
{file = "rapidfuzz-3.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4d0d26c7172bdb64f86ee0765c5b26ea1dc45c52389175888ec073b9b28f4305"}, {file = "rapidfuzz-3.12.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1d4fbff980cb6baef4ee675963c081f7b5d6580a105d6a4962b20f1f880e1fb"},
{file = "rapidfuzz-3.11.0-cp313-cp313-win32.whl", hash = "sha256:6ad02bab756751c90fa27f3069d7b12146613061341459abf55f8190d899649f"}, {file = "rapidfuzz-3.12.1-cp313-cp313-win32.whl", hash = "sha256:3fe8da12ea77271097b303fa7624cfaf5afd90261002314e3b0047d36f4afd8d"},
{file = "rapidfuzz-3.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:b1472986fd9c5d318399a01a0881f4a0bf4950264131bb8e2deba9df6d8c362b"}, {file = "rapidfuzz-3.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:6f7e92fc7d2a7f02e1e01fe4f539324dfab80f27cb70a30dd63a95445566946b"},
{file = "rapidfuzz-3.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:c408f09649cbff8da76f8d3ad878b64ba7f7abdad1471efb293d2c075e80c822"}, {file = "rapidfuzz-3.12.1-cp313-cp313-win_arm64.whl", hash = "sha256:e31be53d7f4905a6a038296d8b773a79da9ee9f0cd19af9490c5c5a22e37d2e5"},
{file = "rapidfuzz-3.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1bac4873f6186f5233b0084b266bfb459e997f4c21fc9f029918f44a9eccd304"}, {file = "rapidfuzz-3.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bef5c91d5db776523530073cda5b2a276283258d2f86764be4a008c83caf7acd"},
{file = "rapidfuzz-3.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f9f12c2d0aa52b86206d2059916153876a9b1cf9dfb3cf2f344913167f1c3d4"}, {file = "rapidfuzz-3.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:841e0c2a5fbe8fc8b9b1a56e924c871899932c0ece7fbd970aa1c32bfd12d4bf"},
{file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd501de6f7a8f83557d20613b58734d1cb5f0be78d794cde64fe43cfc63f5f2"}, {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:046fc67f3885d94693a2151dd913aaf08b10931639cbb953dfeef3151cb1027c"},
{file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4416ca69af933d4a8ad30910149d3db6d084781d5c5fdedb713205389f535385"}, {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4d2d39b2e76c17f92edd6d384dc21fa020871c73251cdfa017149358937a41d"},
{file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f0821b9bdf18c5b7d51722b906b233a39b17f602501a966cfbd9b285f8ab83cd"}, {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5857dda85165b986c26a474b22907db6b93932c99397c818bcdec96340a76d5"},
{file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0edecc3f90c2653298d380f6ea73b536944b767520c2179ec5d40b9145e47aa"}, {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c26cd1b9969ea70dbf0dbda3d2b54ab4b2e683d0fd0f17282169a19563efeb1"},
{file = "rapidfuzz-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4513dd01cee11e354c31b75f652d4d466c9440b6859f84e600bdebfccb17735a"}, {file = "rapidfuzz-3.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf56ea4edd69005786e6c80a9049d95003aeb5798803e7a2906194e7a3cb6472"},
{file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d9727b85511b912571a76ce53c7640ba2c44c364e71cef6d7359b5412739c570"}, {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fbe7580b5fb2db8ebd53819171ff671124237a55ada3f64d20fc9a149d133960"},
{file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ab9eab33ee3213f7751dc07a1a61b8d9a3d748ca4458fffddd9defa6f0493c16"}, {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:018506a53c3b20dcbda8c93d4484b9eb1764c93d5ea16be103cf6b0d8b11d860"},
{file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:6b01c1ddbb054283797967ddc5433d5c108d680e8fa2684cf368be05407b07e4"}, {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:325c9c71b737fcd32e2a4e634c430c07dd3d374cfe134eded3fe46e4c6f9bf5d"},
{file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:3857e335f97058c4b46fa39ca831290b70de554a5c5af0323d2f163b19c5f2a6"}, {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:930756639643e3aa02d3136b6fec74e5b9370a24f8796e1065cd8a857a6a6c50"},
{file = "rapidfuzz-3.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d98a46cf07c0c875d27e8a7ed50f304d83063e49b9ab63f21c19c154b4c0d08d"}, {file = "rapidfuzz-3.12.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0acbd27543b158cb915fde03877383816a9e83257832818f1e803bac9b394900"},
{file = "rapidfuzz-3.11.0-cp39-cp39-win32.whl", hash = "sha256:c36539ed2c0173b053dafb221458812e178cfa3224ade0960599bec194637048"}, {file = "rapidfuzz-3.12.1-cp39-cp39-win32.whl", hash = "sha256:80ff9283c54d7d29b2d954181e137deee89bec62f4a54675d8b6dbb6b15d3e03"},
{file = "rapidfuzz-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:ec8d7d8567e14af34a7911c98f5ac74a3d4a743cd848643341fc92b12b3784ff"}, {file = "rapidfuzz-3.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:fd37e53f0ed239d0cec27b250cec958982a8ba252ce64aa5e6052de3a82fa8db"},
{file = "rapidfuzz-3.11.0-cp39-cp39-win_arm64.whl", hash = "sha256:62171b270ecc4071be1c1f99960317db261d4c8c83c169e7f8ad119211fe7397"}, {file = "rapidfuzz-3.12.1-cp39-cp39-win_arm64.whl", hash = "sha256:4a4422e4f73a579755ab60abccb3ff148b5c224b3c7454a13ca217dfbad54da6"},
{file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f06e3c4c0a8badfc4910b9fd15beb1ad8f3b8fafa8ea82c023e5e607b66a78e4"}, {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b7cba636c32a6fc3a402d1cb2c70c6c9f8e6319380aaf15559db09d868a23e56"},
{file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fe7aaf5a54821d340d21412f7f6e6272a9b17a0cbafc1d68f77f2fc11009dcd5"}, {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b79286738a43e8df8420c4b30a92712dec6247430b130f8e015c3a78b6d61ac2"},
{file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25398d9ac7294e99876a3027ffc52c6bebeb2d702b1895af6ae9c541ee676702"}, {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dc1937198e7ff67e217e60bfa339f05da268d91bb15fec710452d11fe2fdf60"},
{file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a52eea839e4bdc72c5e60a444d26004da00bb5bc6301e99b3dde18212e41465"}, {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b85817a57cf8db32dd5d2d66ccfba656d299b09eaf86234295f89f91be1a0db2"},
{file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c87319b0ab9d269ab84f6453601fd49b35d9e4a601bbaef43743f26fabf496c"}, {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04283c6f3e79f13a784f844cd5b1df4f518ad0f70c789aea733d106c26e1b4fb"},
{file = "rapidfuzz-3.11.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3048c6ed29d693fba7d2a7caf165f5e0bb2b9743a0989012a98a47b975355cca"}, {file = "rapidfuzz-3.12.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a718f740553aad5f4daef790191511da9c6eae893ee1fc2677627e4b624ae2db"},
{file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b04f29735bad9f06bb731c214f27253bd8bedb248ef9b8a1b4c5bde65b838454"}, {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cbdf145c7e4ebf2e81c794ed7a582c4acad19e886d5ad6676086369bd6760753"},
{file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7864e80a0d4e23eb6194254a81ee1216abdc53f9dc85b7f4d56668eced022eb8"}, {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:0d03ad14a26a477be221fddc002954ae68a9e2402b9d85433f2d0a6af01aa2bb"},
{file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3794df87313dfb56fafd679b962e0613c88a293fd9bd5dd5c2793d66bf06a101"}, {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1187aeae9c89e838d2a0a2b954b4052e4897e5f62e5794ef42527bf039d469e"},
{file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d71da0012face6f45432a11bc59af19e62fac5a41f8ce489e80c0add8153c3d1"}, {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd47dfb1bca9673a48b923b3d988b7668ee8efd0562027f58b0f2b7abf27144c"},
{file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff38378346b7018f42cbc1f6d1d3778e36e16d8595f79a312b31e7c25c50bd08"}, {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187cdb402e223264eebed2fe671e367e636a499a7a9c82090b8d4b75aa416c2a"},
{file = "rapidfuzz-3.11.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:6668321f90aa02a5a789d4e16058f2e4f2692c5230252425c3532a8a62bc3424"}, {file = "rapidfuzz-3.12.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d6899b41bf6c30282179f77096c1939f1454836440a8ab05b48ebf7026a3b590"},
{file = "rapidfuzz-3.11.0.tar.gz", hash = "sha256:a53ca4d3f52f00b393fab9b5913c5bafb9afc27d030c8a1db1283da6917a860f"}, {file = "rapidfuzz-3.12.1.tar.gz", hash = "sha256:6a98bbca18b4a37adddf2d8201856441c26e9c981d8895491b5bc857b5f780eb"},
] ]
[package.extras] [package.extras]
@@ -2832,29 +2826,29 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"]
[[package]] [[package]]
name = "ruff" name = "ruff"
version = "0.9.2" version = "0.9.4"
description = "An extremely fast Python linter and code formatter, written in Rust." description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "ruff-0.9.2-py3-none-linux_armv6l.whl", hash = "sha256:80605a039ba1454d002b32139e4970becf84b5fee3a3c3bf1c2af6f61a784347"}, {file = "ruff-0.9.4-py3-none-linux_armv6l.whl", hash = "sha256:64e73d25b954f71ff100bb70f39f1ee09e880728efb4250c632ceed4e4cdf706"},
{file = "ruff-0.9.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b9aab82bb20afd5f596527045c01e6ae25a718ff1784cb92947bff1f83068b00"}, {file = "ruff-0.9.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6ce6743ed64d9afab4fafeaea70d3631b4d4b28b592db21a5c2d1f0ef52934bf"},
{file = "ruff-0.9.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fbd337bac1cfa96be615f6efcd4bc4d077edbc127ef30e2b8ba2a27e18c054d4"}, {file = "ruff-0.9.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:54499fb08408e32b57360f6f9de7157a5fec24ad79cb3f42ef2c3f3f728dfe2b"},
{file = "ruff-0.9.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82b35259b0cbf8daa22a498018e300b9bb0174c2bbb7bcba593935158a78054d"}, {file = "ruff-0.9.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37c892540108314a6f01f105040b5106aeb829fa5fb0561d2dcaf71485021137"},
{file = "ruff-0.9.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b6a9701d1e371bf41dca22015c3f89769da7576884d2add7317ec1ec8cb9c3c"}, {file = "ruff-0.9.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de9edf2ce4b9ddf43fd93e20ef635a900e25f622f87ed6e3047a664d0e8f810e"},
{file = "ruff-0.9.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cc53e68b3c5ae41e8faf83a3b89f4a5d7b2cb666dff4b366bb86ed2a85b481f"}, {file = "ruff-0.9.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87c90c32357c74f11deb7fbb065126d91771b207bf9bfaaee01277ca59b574ec"},
{file = "ruff-0.9.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:8efd9da7a1ee314b910da155ca7e8953094a7c10d0c0a39bfde3fcfd2a015684"}, {file = "ruff-0.9.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:56acd6c694da3695a7461cc55775f3a409c3815ac467279dfa126061d84b314b"},
{file = "ruff-0.9.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3292c5a22ea9a5f9a185e2d131dc7f98f8534a32fb6d2ee7b9944569239c648d"}, {file = "ruff-0.9.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0c93e7d47ed951b9394cf352d6695b31498e68fd5782d6cbc282425655f687a"},
{file = "ruff-0.9.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a605fdcf6e8b2d39f9436d343d1f0ff70c365a1e681546de0104bef81ce88df"}, {file = "ruff-0.9.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d4c8772670aecf037d1bf7a07c39106574d143b26cfe5ed1787d2f31e800214"},
{file = "ruff-0.9.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c547f7f256aa366834829a08375c297fa63386cbe5f1459efaf174086b564247"}, {file = "ruff-0.9.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfc5f1d7afeda8d5d37660eeca6d389b142d7f2b5a1ab659d9214ebd0e025231"},
{file = "ruff-0.9.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d18bba3d3353ed916e882521bc3e0af403949dbada344c20c16ea78f47af965e"}, {file = "ruff-0.9.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:faa935fc00ae854d8b638c16a5f1ce881bc3f67446957dd6f2af440a5fc8526b"},
{file = "ruff-0.9.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b338edc4610142355ccf6b87bd356729b62bf1bc152a2fad5b0c7dc04af77bfe"}, {file = "ruff-0.9.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a6c634fc6f5a0ceae1ab3e13c58183978185d131a29c425e4eaa9f40afe1e6d6"},
{file = "ruff-0.9.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:492a5e44ad9b22a0ea98cf72e40305cbdaf27fac0d927f8bc9e1df316dcc96eb"}, {file = "ruff-0.9.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:433dedf6ddfdec7f1ac7575ec1eb9844fa60c4c8c2f8887a070672b8d353d34c"},
{file = "ruff-0.9.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:af1e9e9fe7b1f767264d26b1075ac4ad831c7db976911fa362d09b2d0356426a"}, {file = "ruff-0.9.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d612dbd0f3a919a8cc1d12037168bfa536862066808960e0cc901404b77968f0"},
{file = "ruff-0.9.2-py3-none-win32.whl", hash = "sha256:71cbe22e178c5da20e1514e1e01029c73dc09288a8028a5d3446e6bba87a5145"}, {file = "ruff-0.9.4-py3-none-win32.whl", hash = "sha256:db1192ddda2200671f9ef61d9597fcef89d934f5d1705e571a93a67fb13a4402"},
{file = "ruff-0.9.2-py3-none-win_amd64.whl", hash = "sha256:c5e1d6abc798419cf46eed03f54f2e0c3adb1ad4b801119dedf23fcaf69b55b5"}, {file = "ruff-0.9.4-py3-none-win_amd64.whl", hash = "sha256:05bebf4cdbe3ef75430d26c375773978950bbf4ee3c95ccb5448940dc092408e"},
{file = "ruff-0.9.2-py3-none-win_arm64.whl", hash = "sha256:a1b63fa24149918f8b37cef2ee6fff81f24f0d74b6f0bdc37bc3e1f2143e41c6"}, {file = "ruff-0.9.4-py3-none-win_arm64.whl", hash = "sha256:585792f1e81509e38ac5123492f8875fbc36f3ede8185af0a26df348e5154f41"},
{file = "ruff-0.9.2.tar.gz", hash = "sha256:b5eceb334d55fae5f316f783437392642ae18e16dcf4f1858d55d3c2a0f8f5d0"}, {file = "ruff-0.9.4.tar.gz", hash = "sha256:6907ee3529244bb0ed066683e075f09285b38dd5b4039370df6ff06041ca19e7"},
] ]
[[package]] [[package]]

View File

@@ -3,7 +3,7 @@ authors = ["Hayden <hay-kot@pm.me>"]
description = "A Recipe Manager" description = "A Recipe Manager"
license = "AGPL" license = "AGPL"
name = "mealie" name = "mealie"
version = "2.4.2" version = "2.5.0"
[tool.poetry.scripts] [tool.poetry.scripts]
start = "mealie.app:main" start = "mealie.app:main"

View File

@@ -17,6 +17,25 @@ def long_live_token(api_client: TestClient, admin_token):
def test_api_token_creation(api_client: TestClient, admin_token): def test_api_token_creation(api_client: TestClient, admin_token):
response = api_client.post(api_routes.users_api_tokens, json={"name": "Test API Token"}, headers=admin_token) response = api_client.post(api_routes.users_api_tokens, json={"name": "Test API Token"}, headers=admin_token)
assert response.status_code == 201 assert response.status_code == 201
assert response.json()["token"]
def test_api_token_private(api_client: TestClient, admin_token):
response = api_client.post(api_routes.users_api_tokens, json={"name": "Test API Token"}, headers=admin_token)
assert response.status_code == 201
response = api_client.get(api_routes.users, headers=admin_token, params={"perPage": -1})
assert response.status_code == 200
for user in response.json()["items"]:
for user_token in user["tokens"] or []:
assert "token" not in user_token
response = api_client.get(api_routes.users_self, headers=admin_token)
assert response.status_code == 200
response_json = response.json()
assert response_json["tokens"]
for user_token in response_json["tokens"]:
assert "token" not in user_token
def test_use_token(api_client: TestClient, long_live_token): def test_use_token(api_client: TestClient, long_live_token):