Source code for tet.i18n
"""
Internationalization support for Tet applications.
This module provides i18n/l10n integration including:
- Automatic ``_()`` and ``gettext()`` functions in templates
- ``ngettext()`` for pluralization
- Request methods for translation (``request.translate``, ``request.pluralize``)
Example
-------
Enabling i18n::
from tet.config import application_factory
@application_factory(included_features=["i18n"])
def main(config):
config.add_translation_dirs("myapp:locale")
config.scan()
Using translations in views::
from pyramid.view import view_config
@view_config(route_name="hello", renderer="json")
def hello(request):
return {"message": request.translate("Hello, World!")}
In Tonnikala templates::
<p>${_("Welcome to our site!")}</p>
<p>${ngettext("1 item", "{n} items", count, mapping={"n": count})}</p>
"""
import sys
from pyramid.config import Configurator
from pyramid.i18n import TranslationStringFactory, get_localizer
from pyramid.threadlocal import get_current_request
[docs]
def add_renderer_globals(event):
"""
Subscriber that adds i18n functions to renderer globals.
Adds ``_``, ``gettext``, ``ngettext``, and ``localizer`` to the template context.
"""
request = event.get("request")
if request is None:
request = get_current_request()
event["_"] = request.translate
event["gettext"] = request.translate
event["ngettext"] = request.pluralize
event["localizer"] = request.localizer
[docs]
def configure_i18n(config: Configurator, default_domain: str):
"""
Configure i18n support for a Pyramid application.
Adds ``request.translate`` and ``request.pluralize`` methods, and
registers subscribers to add i18n functions to template contexts.
:param config: Pyramid Configurator
:param default_domain: Default translation domain
"""
config.add_subscriber(add_renderer_globals, "pyramid.events.BeforeRender")
config.add_subscriber(add_renderer_globals, "tet.viewlet.IBeforeViewletRender")
config.registry.tsf = tsf = TranslationStringFactory(default_domain)
def translate(request):
localizer = request.localizer
def auto_translate(string, *, domain=default_domain, mapping=None, context=None):
if isinstance(string, str):
string = tsf(string, context=context)
return localizer.translate(string, domain=domain, mapping=mapping)
return auto_translate
def pluralize(request):
localizer = request.localizer
def auto_pluralize(singular, plural, n, *, domain=default_domain, mapping=None, context=None):
if isinstance(singular, str):
singular = tsf(singular, context=context)
return localizer.pluralize(singular, plural, n, domain=domain, mapping=mapping)
return auto_pluralize
config.add_request_method(translate, property=True, reify=True)
config.add_request_method(pluralize, property=True, reify=True)
config.add_request_method(get_localizer, name='localize', property=True, reify=True)
[docs]
def includeme(config: Configurator):
"""
Pyramid includeme function for i18n support.
Uses ``default_i18n_domain`` setting or the package name as the domain.
"""
default_domain = config.get_settings().get(
"default_i18n_domain", config.package.__name__
)
configure_i18n(config, default_domain)