2025-01-26 19:33:06 -05:00

80 lines
2.4 KiB
Python

from __future__ import annotations
from contextvars import ContextVar
from typing import TYPE_CHECKING, List, Optional
from babel.core import Locale, UnknownLocaleError
if TYPE_CHECKING:
from redbot.core.i18n import Translator
__all__ = (
"current_locale",
"current_locale_default",
"current_regional_format",
"current_regional_format_default",
"translators",
"set_global_locale",
"set_global_regional_format",
"set_contextual_locale",
"set_contextual_regional_format",
)
current_locale = ContextVar("current_locale")
current_locale_default = "en-US"
current_regional_format = ContextVar("current_regional_format")
current_regional_format_default = None
translators: List[Translator] = []
def _reload_locales() -> None:
for translator in translators:
translator.load_translations()
def _get_standardized_locale_name(language_code: str) -> str:
try:
locale = Locale.parse(language_code, sep="-")
except (ValueError, UnknownLocaleError):
raise ValueError("Invalid language code. Use format: `en-US`")
if locale.territory is None:
raise ValueError(
"Invalid format - language code has to include country code, e.g. `en-US`"
)
return f"{locale.language}-{locale.territory}"
def set_global_locale(language_code: str, /) -> str:
global current_locale_default
current_locale_default = _get_standardized_locale_name(language_code)
_reload_locales()
return current_locale_default
def set_global_regional_format(language_code: Optional[str], /) -> Optional[str]:
global current_regional_format_default
if language_code is not None:
language_code = _get_standardized_locale_name(language_code)
current_regional_format_default = language_code
return language_code
def set_contextual_locale(language_code: str, /, verify_language_code: bool = False) -> str:
if verify_language_code:
language_code = _get_standardized_locale_name(language_code)
current_locale.set(language_code)
_reload_locales()
return language_code
def set_contextual_regional_format(
language_code: str, /, verify_language_code: bool = False
) -> str:
if verify_language_code and language_code is not None:
language_code = _get_standardized_locale_name(language_code)
current_regional_format.set(language_code)
return language_code