mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-12-10 04:15:38 -05:00
59 lines
1.8 KiB
Python
59 lines
1.8 KiB
Python
import json
|
|
from dataclasses import dataclass
|
|
from pathlib import Path
|
|
from typing import cast
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class JsonProvider:
|
|
translations: dict
|
|
|
|
def __init__(self, path: Path | dict):
|
|
if isinstance(path, Path):
|
|
self.translations = json.loads(path.read_text())
|
|
else:
|
|
self.translations = path
|
|
|
|
def _parse_plurals(self, value: str, count: float):
|
|
# based off of: https://kazupon.github.io/vue-i18n/guide/pluralization.html
|
|
|
|
values = [v.strip() for v in value.split("|")]
|
|
if len(values) == 1:
|
|
return value
|
|
elif len(values) == 2:
|
|
return values[0] if count == 1 else values[1]
|
|
elif len(values) == 3:
|
|
if count == 0:
|
|
return values[0]
|
|
else:
|
|
return values[1] if count == 1 else values[2]
|
|
else:
|
|
return values[0]
|
|
|
|
def t(self, key: str, default=None, **kwargs) -> str:
|
|
keys = key.split(".")
|
|
|
|
translation_value: dict | str = self.translations
|
|
last = len(keys) - 1
|
|
|
|
for i, k in enumerate(keys):
|
|
if k not in translation_value:
|
|
break
|
|
|
|
try:
|
|
translation_value = translation_value[k] # type: ignore
|
|
except Exception:
|
|
break
|
|
|
|
if i == last:
|
|
for key, value in kwargs.items():
|
|
translation_value = cast(str, translation_value)
|
|
if value is None:
|
|
value = ""
|
|
if key == "count":
|
|
translation_value = self._parse_plurals(translation_value, float(value))
|
|
translation_value = translation_value.replace("{" + key + "}", str(value)) # type: ignore
|
|
return translation_value # type: ignore
|
|
|
|
return default or key
|