Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions app/backend/src/couchers/i18n/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,6 @@
localize_list,
localize_time,
localize_timezone,
try_localize_language_name_from_iso639,
try_localize_region_name_from_iso3166,
)
from couchers.models.users import User
from couchers.utils import to_timezone
Expand Down Expand Up @@ -67,12 +65,6 @@ def __setattr__(self, name: str, value: Any) -> None:
def localized_timezone(self) -> str:
return localize_timezone(self.timezone, self.babel_locale)

def try_localize_language_name_from_iso639(self, code: str, standalone: bool = False) -> str | None:
return try_localize_language_name_from_iso639(code, self.babel_locale, standalone=standalone)

def try_localize_region_name_from_iso3166(self, code: str) -> str | None:
return try_localize_region_name_from_iso3166(code, self.babel_locale)

def localize_string(
self, key: str, *, i18next: I18Next | None = None, substitutions: SubstitutionDict | None = None
) -> str:
Expand Down
62 changes: 36 additions & 26 deletions app/backend/src/couchers/servicers/resources.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,14 @@
import functools
import logging

import babel
from google.protobuf import empty_pb2
from sqlalchemy.orm import Session

from couchers.context import CouchersContext
from couchers.i18n.localize import try_localize_language_name_from_iso639, try_localize_region_name_from_iso3166
from couchers.proto import resources_pb2, resources_pb2_grpc
from couchers.resources import (
get_badge_dict,
get_icon,
get_language_dict,
get_region_dict,
get_terms_of_service,
)
from couchers.resources import get_badge_dict, get_icon, get_language_dict, get_region_dict, get_terms_of_service

logger = logging.getLogger(__name__)

Expand All @@ -23,6 +20,36 @@
]


# These responses are static per locale, and localizing ~300 names costs tens of ms of CPU (mostly
# babel.Locale.parse), so cache the built protos. Sharing one message across requests is safe as
# long as nothing mutates responses after return (the tracing interceptor deepcopies before
# sanitizing).
@functools.lru_cache
def _get_regions_res(locale: babel.Locale) -> resources_pb2.GetRegionsRes:
Comment thread
aapeliv marked this conversation as resolved.
return resources_pb2.GetRegionsRes(
regions=[
resources_pb2.Region(
alpha3=alpha3,
name=try_localize_region_name_from_iso3166(alpha3, locale) or english_name,
)
for alpha3, english_name in sorted(get_region_dict().items())
]
)


@functools.lru_cache
def _get_languages_res(locale: babel.Locale) -> resources_pb2.GetLanguagesRes:
return resources_pb2.GetLanguagesRes(
languages=[
resources_pb2.Language(
code=code,
name=try_localize_language_name_from_iso639(code, locale, standalone=True) or english_name,
)
for code, english_name in sorted(get_language_dict().items())
]
)


class Resources(resources_pb2_grpc.ResourcesServicer):
def GetTermsOfService(
self, request: empty_pb2.Empty, context: CouchersContext, session: Session
Expand All @@ -46,29 +73,12 @@ def GetCommunityGuidelines(
def GetRegions(
self, request: empty_pb2.Empty, context: CouchersContext, session: Session
) -> resources_pb2.GetRegionsRes:
return resources_pb2.GetRegionsRes(
regions=[
resources_pb2.Region(
alpha3=alpha3,
name=context.localization.try_localize_region_name_from_iso3166(alpha3) or english_name,
)
for alpha3, english_name in sorted(get_region_dict().items())
]
)
return _get_regions_res(context.localization.babel_locale)

def GetLanguages(
self, request: empty_pb2.Empty, context: CouchersContext, session: Session
) -> resources_pb2.GetLanguagesRes:
return resources_pb2.GetLanguagesRes(
languages=[
resources_pb2.Language(
code=code,
name=context.localization.try_localize_language_name_from_iso639(code, standalone=True)
or english_name,
)
for code, english_name in sorted(get_language_dict().items())
]
)
return _get_languages_res(context.localization.babel_locale)

def GetBadges(
self, request: empty_pb2.Empty, context: CouchersContext, session: Session
Expand Down
Loading