Saltar a contenido

API de la biblioteca

GettextWrapper

A wrapper for the gettext module

Source code in streamlit_gettext/streamlit_gettext.py
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
class GettextWrapper:
    """
    A wrapper for the gettext module
    """

    locale_path: Path
    domain: str

    preferred_languages: list[str] | None = None

    def __init__(self, locale_path: str | Path, domain: str = "messages") -> None:
        self.locale_path = Path(locale_path)
        self.domain = domain

    def set_preferred_languages(self, languages: Iterable[str] | None) -> None:
        """
        Manually set preferred languages. If not None then it overrides detected languages.
        """
        self.preferred_languages = list(languages) if languages else None

    def get_preferred_languages(self) -> list[str]:
        """
        Get preferred languages from the browser if preferred languages are not set explicitly
        """
        if self.preferred_languages is not None:
            return self.preferred_languages

        return self.get_preferred_languages_from_browser()

    def get_preferred_languages_from_browser(self) -> list[str]:
        """
        Get preferred languages from the browser
        """
        accept_language = st.context.headers.get("Accept-Language") or ""
        return re.findall(r"([a-zA-Z-]{2,})", accept_language) or []

    def translation(self, languages: Iterable[str] | None = None) -> _gettext_module.NullTranslations:
        return _gettext_module.translation(
            domain=self.domain,
            localedir=self.locale_path,
            languages=languages,
            fallback=True,
        )

    def gettext(self, message: str) -> str:
        """
        Get the translation of a message
        """
        translation = self.translation(self.get_preferred_languages())
        return translation.gettext(message)

    def ngettext(self, singular: str, plural: str, n: int) -> str:
        """
        Get the plural form of a message
        """
        translation = self.translation(self.get_preferred_languages())
        return translation.ngettext(singular, plural, n)

    def pgettext(self, context: str, message: str) -> str:
        """
        Get the translation of a message with a context
        """
        translation = self.translation(self.get_preferred_languages())
        return translation.pgettext(context, message)

    def npgettext(self, context: str, singular: str, plural: str, n: int) -> str:
        """
        Get the plural form of a message with a context
        """
        translation = self.translation(self.get_preferred_languages())
        return translation.npgettext(context, singular, plural, n)

    def get_available_languages(self) -> list[str]:
        """
        Get languages available in the locale directory
        """
        language_codes = [
            path.name
            for path in self.locale_path.iterdir()
            if path.is_dir() and (path / "LC_MESSAGES" / "messages.mo").is_file()
        ]
        language_codes.insert(0, "en")

        preferred_languages = self.get_preferred_languages_from_browser()
        index_map = {language: i for i, language in enumerate(preferred_languages)}

        def sort_key(language: str) -> tuple[int, str]:
            """Prioritize browser-preferred languages, then sort alphabetically."""
            return index_map.get(language, len(index_map)), language.casefold()

        language_codes.sort(key=sort_key)

        return language_codes

get_available_languages()

Get languages available in the locale directory

Source code in streamlit_gettext/streamlit_gettext.py
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
def get_available_languages(self) -> list[str]:
    """
    Get languages available in the locale directory
    """
    language_codes = [
        path.name
        for path in self.locale_path.iterdir()
        if path.is_dir() and (path / "LC_MESSAGES" / "messages.mo").is_file()
    ]
    language_codes.insert(0, "en")

    preferred_languages = self.get_preferred_languages_from_browser()
    index_map = {language: i for i, language in enumerate(preferred_languages)}

    def sort_key(language: str) -> tuple[int, str]:
        """Prioritize browser-preferred languages, then sort alphabetically."""
        return index_map.get(language, len(index_map)), language.casefold()

    language_codes.sort(key=sort_key)

    return language_codes

get_preferred_languages()

Get preferred languages from the browser if preferred languages are not set explicitly

Source code in streamlit_gettext/streamlit_gettext.py
34
35
36
37
38
39
40
41
def get_preferred_languages(self) -> list[str]:
    """
    Get preferred languages from the browser if preferred languages are not set explicitly
    """
    if self.preferred_languages is not None:
        return self.preferred_languages

    return self.get_preferred_languages_from_browser()

get_preferred_languages_from_browser()

Get preferred languages from the browser

Source code in streamlit_gettext/streamlit_gettext.py
43
44
45
46
47
48
def get_preferred_languages_from_browser(self) -> list[str]:
    """
    Get preferred languages from the browser
    """
    accept_language = st.context.headers.get("Accept-Language") or ""
    return re.findall(r"([a-zA-Z-]{2,})", accept_language) or []

gettext(message)

Get the translation of a message

Source code in streamlit_gettext/streamlit_gettext.py
58
59
60
61
62
63
def gettext(self, message: str) -> str:
    """
    Get the translation of a message
    """
    translation = self.translation(self.get_preferred_languages())
    return translation.gettext(message)

ngettext(singular, plural, n)

Get the plural form of a message

Source code in streamlit_gettext/streamlit_gettext.py
65
66
67
68
69
70
def ngettext(self, singular: str, plural: str, n: int) -> str:
    """
    Get the plural form of a message
    """
    translation = self.translation(self.get_preferred_languages())
    return translation.ngettext(singular, plural, n)

npgettext(context, singular, plural, n)

Get the plural form of a message with a context

Source code in streamlit_gettext/streamlit_gettext.py
79
80
81
82
83
84
def npgettext(self, context: str, singular: str, plural: str, n: int) -> str:
    """
    Get the plural form of a message with a context
    """
    translation = self.translation(self.get_preferred_languages())
    return translation.npgettext(context, singular, plural, n)

pgettext(context, message)

Get the translation of a message with a context

Source code in streamlit_gettext/streamlit_gettext.py
72
73
74
75
76
77
def pgettext(self, context: str, message: str) -> str:
    """
    Get the translation of a message with a context
    """
    translation = self.translation(self.get_preferred_languages())
    return translation.pgettext(context, message)

set_preferred_languages(languages)

Manually set preferred languages. If not None then it overrides detected languages.

Source code in streamlit_gettext/streamlit_gettext.py
28
29
30
31
32
def set_preferred_languages(self, languages: Iterable[str] | None) -> None:
    """
    Manually set preferred languages. If not None then it overrides detected languages.
    """
    self.preferred_languages = list(languages) if languages else None