fix: Missing Translations (#3494)

This commit is contained in:
Michael Genson 2024-04-19 05:42:50 -05:00 committed by GitHub
parent 1a385e941c
commit b38c19ce71
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 162 additions and 32 deletions

View File

@ -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)"),

View 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"
}
}

View 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"
}
}

View 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"
}
}

View 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"
}
}

View 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"
}
}

View 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"
}
}

View File

@ -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",

View File

@ -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"

View File

@ -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):

View File

@ -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__()

View File

@ -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)