Files
mealie/mealie/pkgs/i18n/provider_factory.py
2024-11-20 08:46:27 -06:00

49 lines
1.5 KiB
Python

from dataclasses import dataclass, field
from functools import cached_property
from pathlib import Path
from .json_provider import JsonProvider
@dataclass(slots=True)
class InUseProvider:
provider: JsonProvider
locks: int
@dataclass
class ProviderFactory:
directory: Path
fallback_locale: str = "en-US"
filename_format = "{locale}.{format}"
_store: dict[str, InUseProvider] = field(default_factory=dict)
@property
def fallback_file(self) -> Path:
return self.directory / self.filename_format.format(locale=self.fallback_locale, format="json")
@cached_property
def supported_locales(self) -> list[str]:
return [path.stem for path in self.directory.glob(self.filename_format.format(locale="*", format="json"))]
def _load(self, locale: str) -> JsonProvider:
filename = self.filename_format.format(locale=locale, format="json")
path = self.directory / filename
return JsonProvider(path) if path.exists() else JsonProvider(self.fallback_file)
def release(self, locale) -> None:
if locale in self._store:
self._store[locale].locks -= 1
if self._store[locale].locks == 0:
del self._store[locale]
def get(self, locale: str) -> JsonProvider:
if locale in self._store:
self._store[locale].locks += 1
else:
self._store[locale] = InUseProvider(provider=self._load(locale), locks=1)
return self._store[locale].provider