mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-05-31 20:25:14 -04:00
fix: Missing Translations (#3494)
This commit is contained in:
parent
1a385e941c
commit
b38c19ce71
@ -35,18 +35,24 @@ LOCALE_DATA: dict[str, LocaleData] = {
|
|||||||
"es-ES": LocaleData(name="Español (Spanish)"),
|
"es-ES": LocaleData(name="Español (Spanish)"),
|
||||||
"fi-FI": LocaleData(name="Suomi (Finnish)"),
|
"fi-FI": LocaleData(name="Suomi (Finnish)"),
|
||||||
"fr-FR": LocaleData(name="Français (French)"),
|
"fr-FR": LocaleData(name="Français (French)"),
|
||||||
|
"gl-ES": LocaleData(name="Galego (Galician)"),
|
||||||
"he-IL": LocaleData(name="עברית (Hebrew)", dir="rtl"),
|
"he-IL": LocaleData(name="עברית (Hebrew)", dir="rtl"),
|
||||||
|
"hr-HR": LocaleData(name="Hrvatski (Croatian)"),
|
||||||
"hu-HU": LocaleData(name="Magyar (Hungarian)"),
|
"hu-HU": LocaleData(name="Magyar (Hungarian)"),
|
||||||
|
"is-IS": LocaleData(name="Íslenska (Icelandic)"),
|
||||||
"it-IT": LocaleData(name="Italiano (Italian)"),
|
"it-IT": LocaleData(name="Italiano (Italian)"),
|
||||||
"ja-JP": LocaleData(name="日本語 (Japanese)"),
|
"ja-JP": LocaleData(name="日本語 (Japanese)"),
|
||||||
"ko-KR": LocaleData(name="한국어 (Korean)"),
|
"ko-KR": LocaleData(name="한국어 (Korean)"),
|
||||||
"no-NO": LocaleData(name="Norsk (Norwegian)"),
|
"lt-LT": LocaleData(name="Lietuvių (Lithuanian)"),
|
||||||
|
"lv-LV": LocaleData(name="Latviešu (Latvian)"),
|
||||||
"nl-NL": LocaleData(name="Nederlands (Dutch)"),
|
"nl-NL": LocaleData(name="Nederlands (Dutch)"),
|
||||||
|
"no-NO": LocaleData(name="Norsk (Norwegian)"),
|
||||||
"pl-PL": LocaleData(name="Polski (Polish)"),
|
"pl-PL": LocaleData(name="Polski (Polish)"),
|
||||||
"pt-BR": LocaleData(name="Português do Brasil (Brazilian Portuguese)"),
|
"pt-BR": LocaleData(name="Português do Brasil (Brazilian Portuguese)"),
|
||||||
"pt-PT": LocaleData(name="Português (Portuguese)"),
|
"pt-PT": LocaleData(name="Português (Portuguese)"),
|
||||||
"ro-RO": LocaleData(name="Română (Romanian)"),
|
"ro-RO": LocaleData(name="Română (Romanian)"),
|
||||||
"ru-RU": LocaleData(name="Pусский (Russian)"),
|
"ru-RU": LocaleData(name="Pусский (Russian)"),
|
||||||
|
"sl-SI": LocaleData(name="Slovenščina (Slovenian)"),
|
||||||
"sr-SP": LocaleData(name="српски (Serbian)"),
|
"sr-SP": LocaleData(name="српски (Serbian)"),
|
||||||
"sv-SE": LocaleData(name="Svenska (Swedish)"),
|
"sv-SE": LocaleData(name="Svenska (Swedish)"),
|
||||||
"tr-TR": LocaleData(name="Türkçe (Turkish)"),
|
"tr-TR": LocaleData(name="Türkçe (Turkish)"),
|
||||||
|
21
frontend/lang/dateTimeFormats/gl-ES.json
Normal file
21
frontend/lang/dateTimeFormats/gl-ES.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"short": {
|
||||||
|
"month": "short",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long"
|
||||||
|
},
|
||||||
|
"medium": {
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"year": "numeric"
|
||||||
|
},
|
||||||
|
"long": {
|
||||||
|
"year": "numeric",
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"hour": "numeric",
|
||||||
|
"minute": "numeric"
|
||||||
|
}
|
||||||
|
}
|
21
frontend/lang/dateTimeFormats/hr-HR.json
Normal file
21
frontend/lang/dateTimeFormats/hr-HR.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"short": {
|
||||||
|
"month": "short",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long"
|
||||||
|
},
|
||||||
|
"medium": {
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"year": "numeric"
|
||||||
|
},
|
||||||
|
"long": {
|
||||||
|
"year": "numeric",
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"hour": "numeric",
|
||||||
|
"minute": "numeric"
|
||||||
|
}
|
||||||
|
}
|
21
frontend/lang/dateTimeFormats/is-IS.json
Normal file
21
frontend/lang/dateTimeFormats/is-IS.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"short": {
|
||||||
|
"month": "short",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long"
|
||||||
|
},
|
||||||
|
"medium": {
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"year": "numeric"
|
||||||
|
},
|
||||||
|
"long": {
|
||||||
|
"year": "numeric",
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"hour": "numeric",
|
||||||
|
"minute": "numeric"
|
||||||
|
}
|
||||||
|
}
|
21
frontend/lang/dateTimeFormats/lt-LT.json
Normal file
21
frontend/lang/dateTimeFormats/lt-LT.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"short": {
|
||||||
|
"month": "short",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long"
|
||||||
|
},
|
||||||
|
"medium": {
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"year": "numeric"
|
||||||
|
},
|
||||||
|
"long": {
|
||||||
|
"year": "numeric",
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"hour": "numeric",
|
||||||
|
"minute": "numeric"
|
||||||
|
}
|
||||||
|
}
|
21
frontend/lang/dateTimeFormats/lv-LV.json
Normal file
21
frontend/lang/dateTimeFormats/lv-LV.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"short": {
|
||||||
|
"month": "short",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long"
|
||||||
|
},
|
||||||
|
"medium": {
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"year": "numeric"
|
||||||
|
},
|
||||||
|
"long": {
|
||||||
|
"year": "numeric",
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"hour": "numeric",
|
||||||
|
"minute": "numeric"
|
||||||
|
}
|
||||||
|
}
|
21
frontend/lang/dateTimeFormats/sl-SI.json
Normal file
21
frontend/lang/dateTimeFormats/sl-SI.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"short": {
|
||||||
|
"month": "short",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long"
|
||||||
|
},
|
||||||
|
"medium": {
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"year": "numeric"
|
||||||
|
},
|
||||||
|
"long": {
|
||||||
|
"year": "numeric",
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"hour": "numeric",
|
||||||
|
"minute": "numeric"
|
||||||
|
}
|
||||||
|
}
|
@ -260,6 +260,12 @@ export default {
|
|||||||
"en-GB": require("./lang/dateTimeFormats/en-GB.json"),
|
"en-GB": require("./lang/dateTimeFormats/en-GB.json"),
|
||||||
"fi-FI": require("./lang/dateTimeFormats/fi-FI.json"),
|
"fi-FI": require("./lang/dateTimeFormats/fi-FI.json"),
|
||||||
"vi-VN": require("./lang/dateTimeFormats/vi-VN.json"),
|
"vi-VN": require("./lang/dateTimeFormats/vi-VN.json"),
|
||||||
|
"sl-SI": require("./lang/dateTimeFormats/sl-SI.json"),
|
||||||
|
"lv-LV": require("./lang/dateTimeFormats/lv-LV.json"),
|
||||||
|
"is-IS": require("./lang/dateTimeFormats/is-IS.json"),
|
||||||
|
"gl-ES": require("./lang/dateTimeFormats/gl-ES.json"),
|
||||||
|
"lt-LT": require("./lang/dateTimeFormats/lt-LT.json"),
|
||||||
|
"hr-HR": require("./lang/dateTimeFormats/hr-HR.json"),
|
||||||
// END: DATE_LOCALES
|
// END: DATE_LOCALES
|
||||||
},
|
},
|
||||||
fallbackLocale: "en-US",
|
fallbackLocale: "en-US",
|
||||||
|
@ -3,7 +3,11 @@
|
|||||||
"server-error": "An unexpected error occurred"
|
"server-error": "An unexpected error occurred"
|
||||||
},
|
},
|
||||||
"recipe": {
|
"recipe": {
|
||||||
"unique-name-error": "Recipe names must be unique"
|
"unique-name-error": "Recipe names must be unique",
|
||||||
|
"recipe-defaults": {
|
||||||
|
"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"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"mealplan": {
|
"mealplan": {
|
||||||
"no-recipes-match-your-rules": "No recipes match your rules"
|
"no-recipes-match-your-rules": "No recipes match your rules"
|
||||||
|
@ -72,7 +72,7 @@ class BaseRecipeController(BaseCrudController):
|
|||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def service(self) -> RecipeService:
|
def service(self) -> RecipeService:
|
||||||
return RecipeService(self.repos, self.user, self.group)
|
return RecipeService(self.repos, self.user, self.group, translator=self.translator)
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def mixins(self):
|
def mixins(self):
|
||||||
|
@ -70,7 +70,7 @@ class BaseMigrator(BaseService):
|
|||||||
self.logger = root_logger.get_logger()
|
self.logger = root_logger.get_logger()
|
||||||
|
|
||||||
self.helpers = DatabaseMigrationHelpers(self.db, self.session, self.group.id, self.user.id)
|
self.helpers = DatabaseMigrationHelpers(self.db, self.session, self.group.id, self.user.id)
|
||||||
self.recipe_service = RecipeService(db, user, group)
|
self.recipe_service = RecipeService(db, user, group, translator=self.translator)
|
||||||
|
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@ from fastapi import UploadFile
|
|||||||
from slugify import slugify
|
from slugify import slugify
|
||||||
|
|
||||||
from mealie.core import exceptions
|
from mealie.core import exceptions
|
||||||
|
from mealie.lang.providers import Translator
|
||||||
from mealie.pkgs import cache
|
from mealie.pkgs import cache
|
||||||
from mealie.repos.repository_factory import AllRepositories
|
from mealie.repos.repository_factory import AllRepositories
|
||||||
from mealie.repos.repository_generic import RepositoryGeneric
|
from mealie.repos.repository_generic import RepositoryGeneric
|
||||||
@ -26,22 +27,16 @@ from mealie.services.recipe.recipe_data_service import RecipeDataService
|
|||||||
|
|
||||||
from .template_service import TemplateService
|
from .template_service import TemplateService
|
||||||
|
|
||||||
step_text = """Recipe steps as well as other fields in the recipe page support markdown syntax.
|
|
||||||
|
|
||||||
**Add a link**
|
|
||||||
|
|
||||||
[My Link](https://demo.mealie.io)
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
ingredient_note = "1 Cup Flour"
|
|
||||||
|
|
||||||
|
|
||||||
class RecipeService(BaseService):
|
class RecipeService(BaseService):
|
||||||
def __init__(self, repos: AllRepositories, user: PrivateUser, group: GroupInDB):
|
def __init__(self, repos: AllRepositories, user: PrivateUser, group: GroupInDB, translator: Translator):
|
||||||
self.repos = repos
|
self.repos = repos
|
||||||
self.user = user
|
self.user = user
|
||||||
self.group = group
|
self.group = group
|
||||||
|
|
||||||
|
self.translator = translator
|
||||||
|
self.t = translator.t
|
||||||
|
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
def _get_recipe(self, data: str | UUID, key: str | None = None) -> Recipe:
|
def _get_recipe(self, data: str | UUID, key: str | None = None) -> Recipe:
|
||||||
@ -85,8 +80,7 @@ class RecipeService(BaseService):
|
|||||||
rmtree(recipe_dir, ignore_errors=True)
|
rmtree(recipe_dir, ignore_errors=True)
|
||||||
self.logger.info(f"Recipe Directory Removed: {recipe.slug}")
|
self.logger.info(f"Recipe Directory Removed: {recipe.slug}")
|
||||||
|
|
||||||
@staticmethod
|
def _recipe_creation_factory(self, name: str, additional_attrs: dict | None = None) -> Recipe:
|
||||||
def _recipe_creation_factory(user: PrivateUser, name: str, additional_attrs: dict | None = None) -> Recipe:
|
|
||||||
"""
|
"""
|
||||||
The main creation point for recipes. The factor method returns an instance of the
|
The main creation point for recipes. The factor method returns an instance of the
|
||||||
Recipe Schema class with the appropriate defaults set. Recipes should not be created
|
Recipe Schema class with the appropriate defaults set. Recipes should not be created
|
||||||
@ -94,18 +88,20 @@ class RecipeService(BaseService):
|
|||||||
"""
|
"""
|
||||||
additional_attrs = additional_attrs or {}
|
additional_attrs = additional_attrs or {}
|
||||||
additional_attrs["name"] = name
|
additional_attrs["name"] = name
|
||||||
additional_attrs["user_id"] = user.id
|
additional_attrs["user_id"] = self.user.id
|
||||||
additional_attrs["group_id"] = user.group_id
|
additional_attrs["group_id"] = self.user.group_id
|
||||||
|
|
||||||
if additional_attrs.get("tags"):
|
if additional_attrs.get("tags"):
|
||||||
for i in range(len(additional_attrs.get("tags", []))):
|
for i in range(len(additional_attrs.get("tags", []))):
|
||||||
additional_attrs["tags"][i]["group_id"] = user.group_id
|
additional_attrs["tags"][i]["group_id"] = self.user.group_id
|
||||||
|
|
||||||
if not additional_attrs.get("recipe_ingredient"):
|
if not additional_attrs.get("recipe_ingredient"):
|
||||||
additional_attrs["recipe_ingredient"] = [RecipeIngredient(note=ingredient_note)]
|
additional_attrs["recipe_ingredient"] = [
|
||||||
|
RecipeIngredient(note=self.t("recipe.recipe-defaults.ingredient-note"))
|
||||||
|
]
|
||||||
|
|
||||||
if not additional_attrs.get("recipe_instructions"):
|
if not additional_attrs.get("recipe_instructions"):
|
||||||
additional_attrs["recipe_instructions"] = [RecipeStep(text=step_text)]
|
additional_attrs["recipe_instructions"] = [RecipeStep(text=self.t("recipe.recipe-defaults.step-text"))]
|
||||||
|
|
||||||
return Recipe(**additional_attrs)
|
return Recipe(**additional_attrs)
|
||||||
|
|
||||||
@ -126,11 +122,7 @@ class RecipeService(BaseService):
|
|||||||
if create_data.name is None:
|
if create_data.name is None:
|
||||||
create_data.name = "New Recipe"
|
create_data.name = "New Recipe"
|
||||||
|
|
||||||
data: Recipe = self._recipe_creation_factory(
|
data: Recipe = self._recipe_creation_factory(name=create_data.name, additional_attrs=create_data.model_dump())
|
||||||
self.user,
|
|
||||||
name=create_data.name,
|
|
||||||
additional_attrs=create_data.model_dump(),
|
|
||||||
)
|
|
||||||
|
|
||||||
if isinstance(create_data, CreateRecipe) or create_data.settings is None:
|
if isinstance(create_data, CreateRecipe) or create_data.settings is None:
|
||||||
if self.group.preferences is not None:
|
if self.group.preferences is not None:
|
||||||
@ -294,11 +286,7 @@ class RecipeService(BaseService):
|
|||||||
else list(map(copy_recipe_ingredient, old_recipe.recipe_ingredient))
|
else list(map(copy_recipe_ingredient, old_recipe.recipe_ingredient))
|
||||||
)
|
)
|
||||||
|
|
||||||
new_recipe = self._recipe_creation_factory(
|
new_recipe = self._recipe_creation_factory(new_name, additional_attrs=new_recipe.model_dump())
|
||||||
self.user,
|
|
||||||
new_name,
|
|
||||||
additional_attrs=new_recipe.model_dump(),
|
|
||||||
)
|
|
||||||
|
|
||||||
new_recipe = self.repos.recipes.create(new_recipe)
|
new_recipe = self.repos.recipes.create(new_recipe)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user