61 lines
1.7 KiB
Python
61 lines
1.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
import gettext as gettext_module
|
|
from threading import local
|
|
import os.path
|
|
|
|
__all__ = ['activate', 'deactivate', 'gettext', 'ngettext']
|
|
|
|
_TRANSLATIONS = {None: gettext_module.NullTranslations()}
|
|
_CURRENT = local()
|
|
|
|
_DEFAULT_LOCALE_PATH = os.path.join(os.path.dirname(__file__), 'locale')
|
|
|
|
|
|
def get_translation():
|
|
try:
|
|
return _TRANSLATIONS[_CURRENT.locale]
|
|
except (AttributeError, KeyError):
|
|
return _TRANSLATIONS[None]
|
|
|
|
|
|
def activate(locale, path=None):
|
|
"""Set 'locale' as current locale. Search for locale in directory 'path'
|
|
@param locale: language name, eg 'en_GB'"""
|
|
if path is None:
|
|
path = _DEFAULT_LOCALE_PATH
|
|
if locale not in _TRANSLATIONS:
|
|
translation = gettext_module.translation('humanize', path, [locale])
|
|
_TRANSLATIONS[locale] = translation
|
|
_CURRENT.locale = locale
|
|
return _TRANSLATIONS[locale]
|
|
|
|
|
|
def deactivate():
|
|
_CURRENT.locale = None
|
|
|
|
|
|
def gettext(message):
|
|
return get_translation().gettext(message)
|
|
|
|
|
|
def pgettext(msgctxt, message):
|
|
"""'Particular gettext' function.
|
|
It works with 'msgctxt' .po modifiers and allow duplicate keys with
|
|
different translations.
|
|
Python 2 don't have support for this GNU gettext function, so we
|
|
reimplement it. It works by joining msgctx and msgid by '4' byte."""
|
|
key = msgctxt + '\x04' + message
|
|
translation = get_translation().gettext(key)
|
|
return message if translation == key else translation
|
|
|
|
|
|
def ngettext(message, plural, num):
|
|
return get_translation().ngettext(message, plural, num)
|
|
|
|
|
|
def gettext_noop(message):
|
|
"""Example usage:
|
|
CONSTANTS = [gettext_noop('first'), gettext_noop('second')]
|
|
def num_name(n):
|
|
return gettext(CONSTANTS[n])"""
|
|
return message
|