web/lib/django/views/i18n.py
author ymh <ymh.work@gmail.com>
Wed, 02 Jun 2010 18:57:35 +0200
changeset 38 77b6da96e6f1
permissions -rw-r--r--
update django
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
import os
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
import gettext as gettext_module
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
from django import http
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
from django.conf import settings
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
from django.utils import importlib
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
from django.utils.translation import check_for_language, activate, to_locale, get_language
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
from django.utils.text import javascript_quote
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
from django.utils.encoding import smart_unicode
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
from django.utils.formats import get_format_modules
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
def set_language(request):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
    Redirect to a given url while setting the chosen language in the
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
    session or cookie. The url and the language code need to be
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
    specified in the request parameters.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
    Since this view changes how the user will see the rest of the site, it must
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    only be accessed as a POST request. If called as a GET request, it will
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    redirect to the page in the request (the 'next' parameter) without changing
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    any state.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    next = request.REQUEST.get('next', None)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    if not next:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
        next = request.META.get('HTTP_REFERER', None)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    if not next:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
        next = '/'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    response = http.HttpResponseRedirect(next)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    if request.method == 'POST':
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
        lang_code = request.POST.get('language', None)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
        if lang_code and check_for_language(lang_code):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
            if hasattr(request, 'session'):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
                request.session['django_language'] = lang_code
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
            else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
                response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    return response
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
def get_formats():
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    Returns all formats strings required for i18n to work
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
    FORMAT_SETTINGS = (
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
        'DATE_FORMAT', 'DATETIME_FORMAT', 'TIME_FORMAT',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
        'YEAR_MONTH_FORMAT', 'MONTH_DAY_FORMAT', 'SHORT_DATE_FORMAT',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
        'SHORT_DATETIME_FORMAT', 'FIRST_DAY_OF_WEEK', 'DECIMAL_SEPARATOR',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
        'THOUSAND_SEPARATOR', 'NUMBER_GROUPING',
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
        'DATE_INPUT_FORMATS', 'TIME_INPUT_FORMATS', 'DATETIME_INPUT_FORMATS'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    )
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    result = {}
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
    for module in [settings] + get_format_modules(reverse=True):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
        for attr in FORMAT_SETTINGS:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
            try:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
                result[attr] = getattr(module, attr)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
            except AttributeError:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
                pass
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
    src = []
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
    for k, v in result.items():
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        if isinstance(v, (basestring, int)):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
            src.append("formats['%s'] = '%s';\n" % (javascript_quote(k), javascript_quote(smart_unicode(v))))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        elif isinstance(v, (tuple, list)):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
            v = [javascript_quote(smart_unicode(value)) for value in v]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
            src.append("formats['%s'] = ['%s'];\n" % (javascript_quote(k), "', '".join(v)))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
    return ''.join(src)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
NullSource = """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
/* gettext identity library */
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
function gettext(msgid) { return msgid; }
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
function ngettext(singular, plural, count) { return (count == 1) ? singular : plural; }
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
function gettext_noop(msgid) { return msgid; }
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
"""
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
LibHead = """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
/* gettext library */
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
var catalog = new Array();
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
"""
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
LibFoot = """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
function gettext(msgid) {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
  var value = catalog[msgid];
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
  if (typeof(value) == 'undefined') {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
    return msgid;
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
  } else {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
    return (typeof(value) == 'string') ? value : value[0];
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
  }
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
}
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
function ngettext(singular, plural, count) {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
  value = catalog[singular];
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
  if (typeof(value) == 'undefined') {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
    return (count == 1) ? singular : plural;
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
  } else {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
    return value[pluralidx(count)];
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
  }
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
}
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
function gettext_noop(msgid) { return msgid; }
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
"""
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
LibFormatHead = """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
/* formatting library */
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
var formats = new Array();
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
"""
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
LibFormatFoot = """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
function get_format(format_type) {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
    var value = formats[format_type];
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
    if (typeof(value) == 'undefined') {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
      return msgid;
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
    } else {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
      return value;
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
    }
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
}
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
"""
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
SimplePlural = """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
function pluralidx(count) { return (count == 1) ? 0 : 1; }
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
"""
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
InterPolate = r"""
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
function interpolate(fmt, obj, named) {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
  if (named) {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
    return fmt.replace(/%\(\w+\)s/g, function(match){return String(obj[match.slice(2,-2)])});
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
  } else {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
    return fmt.replace(/%s/g, function(match){return String(obj.shift())});
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
  }
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
}
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
"""
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
PluralIdx = r"""
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
function pluralidx(n) {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
  var v=%s;
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
  if (typeof(v) == 'boolean') {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
    return v ? 1 : 0;
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
  } else {
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
    return v;
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
  }
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
}
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
"""
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
def null_javascript_catalog(request, domain=None, packages=None):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
    Returns "identity" versions of the JavaScript i18n functions -- i.e.,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
    versions that don't actually do anything.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
    src = [NullSource, InterPolate, LibFormatHead, get_formats(), LibFormatFoot]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
    return http.HttpResponse(''.join(src), 'text/javascript')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
def javascript_catalog(request, domain='djangojs', packages=None):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
    Returns the selected language catalog as a javascript library.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
    Receives the list of packages to check for translations in the
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
    packages parameter either from an infodict or as a +-delimited
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
    string from the request. Default is 'django.conf'.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
    Additionally you can override the gettext domain for this view,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
    but usually you don't want to do that, as JavaScript messages
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
    go to the djangojs domain. But this might be needed if you
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
    deliver your JavaScript source from Django templates.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
    if request.GET:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
        if 'language' in request.GET:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
            if check_for_language(request.GET['language']):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
                activate(request.GET['language'])
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
    if packages is None:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
        packages = ['django.conf']
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
    if isinstance(packages, basestring):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
        packages = packages.split('+')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
    packages = [p for p in packages if p == 'django.conf' or p in settings.INSTALLED_APPS]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
    default_locale = to_locale(settings.LANGUAGE_CODE)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
    locale = to_locale(get_language())
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
    t = {}
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
    paths = []
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
    en_catalog_missing = False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
    # first load all english languages files for defaults
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
    for package in packages:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
        p = importlib.import_module(package)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
        path = os.path.join(os.path.dirname(p.__file__), 'locale')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
        paths.append(path)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
        try:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
            catalog = gettext_module.translation(domain, path, ['en'])
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
            t.update(catalog._catalog)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
        except IOError:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
            # 'en' catalog was missing.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
            if locale.startswith('en'):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
                # If 'en' is the selected language this would cause issues
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
                # later on if default_locale is something other than 'en'.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
                en_catalog_missing = True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
            # Otherwise it is harmless.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
            pass
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
    # next load the settings.LANGUAGE_CODE translations if it isn't english
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
    if default_locale != 'en':
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
        for path in paths:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
            try:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
                catalog = gettext_module.translation(domain, path, [default_locale])
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
            except IOError:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
                catalog = None
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
            if catalog is not None:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
                t.update(catalog._catalog)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
    # last load the currently selected language, if it isn't identical to the default.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
    if locale != default_locale:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
        # If the flag en_catalog_missing has been set, the currently
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
        # selected language is English but it doesn't have a translation
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
        # catalog (presumably due to being the language translated from).
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
        # If that is the case, a wrong language catalog might have been
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
        # loaded in the previous step. It needs to be discarded.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
        if en_catalog_missing:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
            t = {}
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
        else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
            locale_t = {}
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
            for path in paths:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
                try:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
                    catalog = gettext_module.translation(domain, path, [locale])
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
                except IOError:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
                    catalog = None
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
                if catalog is not None:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
                    locale_t.update(catalog._catalog)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
            if locale_t:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
                t = locale_t
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
    src = [LibHead]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
    plural = None
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
    if '' in t:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
        for l in t[''].split('\n'):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
            if l.startswith('Plural-Forms:'):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
                plural = l.split(':',1)[1].strip()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
    if plural is not None:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
        # this should actually be a compiled function of a typical plural-form:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
        # Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
        plural = [el.strip() for el in plural.split(';') if el.strip().startswith('plural=')][0].split('=',1)[1]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
        src.append(PluralIdx % plural)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
    else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
        src.append(SimplePlural)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
    csrc = []
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
    pdict = {}
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
    for k, v in t.items():
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
        if k == '':
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
            continue
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
        if isinstance(k, basestring):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
            csrc.append("catalog['%s'] = '%s';\n" % (javascript_quote(k), javascript_quote(v)))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
        elif isinstance(k, tuple):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
            if k[0] not in pdict:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
                pdict[k[0]] = k[1]
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
            else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
                pdict[k[0]] = max(k[1], pdict[k[0]])
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
            csrc.append("catalog['%s'][%d] = '%s';\n" % (javascript_quote(k[0]), k[1], javascript_quote(v)))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
        else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
            raise TypeError(k)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
    csrc.sort()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
    for k, v in pdict.items():
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
        src.append("catalog['%s'] = [%s];\n" % (javascript_quote(k), ','.join(["''"]*(v+1))))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
    src.extend(csrc)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
    src.append(LibFoot)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
    src.append(InterPolate)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
    src.append(LibFormatHead)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
    src.append(get_formats())
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
    src.append(LibFormatFoot)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
    src = ''.join(src)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
    return http.HttpResponse(src, 'text/javascript')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265