Django

Code

Ticket #4030: make-language-names.diff

File make-language-names.diff, 3.7 kB (added by akaihola, 10 months ago)

implements mtredinnick's suggestion: a script for generating a local language name module and a fixed template tag

  • django/templatetags/i18n.py

    old new  
    1414        context[self.variable] = [(k, translation.ugettext(v)) for k, v in settings.LANGUAGES] 
    1515        return '' 
    1616 
     17class GetAvailableLanguageNamesNode(Node): 
     18    def __init__(self, variable): 
     19        self.variable = variable 
     20 
     21    def render(self, context): 
     22        from django.conf.language_names import language_names 
     23        context[self.variable] = language_names 
     24        return '' 
     25 
    1726class GetCurrentLanguageNode(Node): 
    1827    def __init__(self, variable): 
    1928        self.variable = variable 
     
    95104        raise TemplateSyntaxError, "'get_available_languages' requires 'as variable' (got %r)" % args 
    96105    return GetAvailableLanguagesNode(args[2]) 
    97106 
     107def do_get_available_language_names(parser, token): 
     108    """ 
     109    This will store in the context a list of available 
     110    languages and supply each item with the name of the 
     111    language both in the current language and the 
     112    language itself. 
     113 
     114    Usage:: 
     115 
     116        {% get_available_language_names as languages %} 
     117        {% for language in languages %} 
     118        ... 
     119        {% endfor %} 
     120 
     121    This will convert the LANGUAGES setting from your 
     122    setting file (or the default settings) to a list of 
     123    dicts and put it into the named variable.  Each item 
     124    will have the keys ``language_code``, ``name`` and 
     125    ``name_local``. 
     126    """ 
     127    args = token.contents.split() 
     128    if len(args) != 3 or args[1] != 'as': 
     129        raise TemplateSyntaxError, "'get_available_language_names' requires 'as variable' (got %r)" % args 
     130    return GetAvailableLanguageNamesNode(args[2]) 
     131 
    98132def do_get_current_language(parser, token): 
    99133    """ 
    100134    This will store the current language in the context. 
     
    240274    return BlockTranslateNode(extra_context, singular, plural, countervar, counter) 
    241275 
    242276register.tag('get_available_languages', do_get_available_languages) 
     277register.tag('get_available_language_names', do_get_available_language_names) 
    243278register.tag('get_current_language', do_get_current_language) 
    244279register.tag('get_current_language_bidi', do_get_current_language_bidi) 
    245280register.tag('trans', do_translate) 
  • django/bin/make-language-names.py

    old new  
     1#!/usr/bin/env python 
     2 
     3LANGUAGE_NAMES_PY_FILE = 'django/conf/language_names.py' 
     4 
     5# Need to ensure that the i18n framework is enabled 
     6from django.conf import settings 
     7settings.configure(USE_I18N = True) 
     8 
     9from django.utils import translation 
     10 
     11def make_language_names(): 
     12    language_names = [] 
     13    for code, name in settings.LANGUAGES: 
     14        try: 
     15            translation.activate(code) 
     16        except IndexError: 
     17            print "Warning: Can't activate language %r, using English name %r." % (code, name) 
     18            translation.activate('en') 
     19        language_names.append({ 
     20            'language_code': code, 
     21            'name': name, 
     22            'name_local': translation.ugettext(name)}) 
     23    from os.path import join, dirname, abspath 
     24    target = abspath(join(dirname(__file__), '..', '..', LANGUAGE_NAMES_PY_FILE)) 
     25    print 'Writing language names list to\n%s' % target 
     26    file(target, 'w').write('language_names = %r\n' % language_names) 
     27    print 'Done.' 
     28 
     29 
     30if __name__ == "__main__": 
     31    make_language_names()