Commit 83aeb3c7 authored by Jannis Leidel's avatar Jannis Leidel
Browse files

Fixed #9988 -- Added support for translation contexts. Thanks, Claude Paroz.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14450 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 0659391b
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -190,7 +190,7 @@ def make_messages(locale=None, domain='django', verbosity='1', all=False,
                    f.write(src)
                finally:
                    f.close()
                cmd = 'xgettext -d %s -L Perl --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % (domain, os.path.join(dirpath, thefile))
                cmd = 'xgettext -d %s -L Perl --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --keyword=pgettext:1c,2 --keyword=npgettext:1c,2,3 --from-code UTF-8 -o - "%s"' % (domain, os.path.join(dirpath, thefile))
                msgs, errors = _popen(cmd)
                if errors:
                    raise CommandError("errors happened while running xgettext on %s\n%s" % (file, errors))
@@ -225,7 +225,7 @@ def make_messages(locale=None, domain='django', verbosity='1', all=False,
                        raise SyntaxError(msg)
                if verbosity > 1:
                    sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
                cmd = 'xgettext -d %s -L Python --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --keyword=ugettext_noop --keyword=ugettext_lazy --keyword=ungettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % (
                cmd = 'xgettext -d %s -L Python --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --keyword=ugettext_noop --keyword=ugettext_lazy --keyword=ungettext_lazy:1,2 --keyword=pgettext:1c,2 --keyword=npgettext:1c,2,3 --keyword=pgettext_lazy:1c,2 --keyword=npgettext_lazy:1c,2,3 --from-code UTF-8 -o - "%s"' % (
                    domain, os.path.join(dirpath, thefile))
                msgs, errors = _popen(cmd)
                if errors:
+10 −1
Original line number Diff line number Diff line
@@ -10,7 +10,8 @@ __all__ = ['gettext', 'gettext_noop', 'gettext_lazy', 'ngettext',
        'get_language', 'get_language_bidi', 'get_date_formats',
        'get_partial_date_formats', 'check_for_language', 'to_locale',
        'get_language_from_request', 'templatize', 'ugettext', 'ugettext_lazy',
        'ungettext', 'deactivate_all']
        'ungettext', 'ungettext_lazy', 'pgettext', 'pgettext_lazy',
        'npgettext', 'npgettext_lazy', 'deactivate_all']

# Here be dragons, so a short explanation of the logic won't hurt:
# We are trying to solve two problems: (1) access settings, in particular
@@ -63,10 +64,18 @@ def ugettext(message):
def ungettext(singular, plural, number):
    return _trans.ungettext(singular, plural, number)

def pgettext(context, message):
    return _trans.pgettext(context, message)

def npgettext(context, singular, plural, number):
    return _trans.npgettext(context, singular, plural, number)

ngettext_lazy = lazy(ngettext, str)
gettext_lazy = lazy(gettext, str)
ungettext_lazy = lazy(ungettext, unicode)
ugettext_lazy = lazy(ugettext, unicode)
pgettext_lazy = lazy(pgettext, unicode)
npgettext_lazy = lazy(npgettext, unicode)

def activate(language):
    return _trans.activate(language)
+6 −0
Original line number Diff line number Diff line
@@ -15,6 +15,12 @@ ngettext_lazy = ngettext
def ungettext(singular, plural, number):
    return force_unicode(ngettext(singular, plural, number))

def pgettext(context, message):
    return ugettext(message)

def npgettext(context, singular, plural, number):
    return ungettext(singular, plural, number)

activate = lambda x: None
deactivate = deactivate_all = lambda: None
get_language = lambda: settings.LANGUAGE_CODE
+20 −0
Original line number Diff line number Diff line
@@ -24,6 +24,9 @@ _default = None
# file lookups when checking the same locale on repeated requests.
_accepted = {}

# magic gettext number to separate context from message
CONTEXT_SEPARATOR = u"\x04"

# Format of Accept-Language header values. From RFC 2616, section 14.4 and 3.9.
accept_language_re = re.compile(r'''
        ([A-Za-z]{1,8}(?:-[A-Za-z]{1,8})*|\*)   # "en", "en-au", "x-y-z", "*"
@@ -279,6 +282,14 @@ def gettext(message):
def ugettext(message):
    return do_translate(message, 'ugettext')

def pgettext(context, message):
    result = do_translate(
        u"%s%s%s" % (context, CONTEXT_SEPARATOR, message), 'ugettext')
    if CONTEXT_SEPARATOR in result:
        # Translation not found
        result = message
    return result

def gettext_noop(message):
    """
    Marks strings for translation but doesn't translate them now. This can be
@@ -313,6 +324,15 @@ def ungettext(singular, plural, number):
    """
    return do_ntranslate(singular, plural, number, 'ungettext')

def npgettext(context, singular, plural, number):
    result = do_ntranslate(u"%s%s%s" % (context, CONTEXT_SEPARATOR, singular),
                           u"%s%s%s" % (context, CONTEXT_SEPARATOR, plural),
                           number, 'ungettext')
    if CONTEXT_SEPARATOR in result:
        # Translation not found
        result = do_ntranslate(singular, plural, number, 'ungettext')
    return result

def check_for_language(lang_code):
    """
    Checks whether there is a global language file for the given language
+17 −0
Original line number Diff line number Diff line
@@ -68,6 +68,8 @@ NullSource = """
function gettext(msgid) { return msgid; }
function ngettext(singular, plural, count) { return (count == 1) ? singular : plural; }
function gettext_noop(msgid) { return msgid; }
function pgettext(context, msgid) { return msgid; }
function npgettext(context, singular, plural, count) { return (count == 1) ? singular : plural; }
"""

LibHead = """
@@ -98,6 +100,21 @@ function ngettext(singular, plural, count) {

function gettext_noop(msgid) { return msgid; }

function pgettext(context, msgid) {
  var value = gettext(context + '\x04' + msgid);
  if (value.indexOf('\x04') != -1) {
    value = msgid;
  }
  return value;
}

function npgettext(context, singular, plural, count) {
  var value = ngettext(context + '\x04' + singular, context + '\x04' + plural, count);
  if (value.indexOf('\x04') != -1) {
    value = ngettext(singular, plural, count);
  }
  return value;
}
"""

LibFormatHead = """
Loading