Django

Code

Changeset 7357

Show
Ignore:
Timestamp:
03/24/08 08:35:27 (6 months ago)
Author:
mtredinnick
Message:

Fixed #6859 -- Greatly cleaned up the section on i18n pluralization in
Javascript. With new example code and everything! Thanks, Ramiro Morales.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/docs/i18n.txt

    r7294 r7357  
    339339functions are used by template filters as well as directly in other code. 
    340340 
    341 If you write your own similar functions and deal with translations, you'll  
     341If you write your own similar functions and deal with translations, you'll 
    342342face the problem of what to do when the first argument is a lazy translation 
    343343object. You don't want to convert it to a string immediately, because you might 
     
    790790 
    791791    urlpatterns = patterns('', 
    792         (r'^jsi18n/(?P<packages>\S+?)/$, 'django.views.i18n.javascript_catalog'), 
     792        (r'^jsi18n/(?P<packages>\S+?)/$', 'django.views.i18n.javascript_catalog'), 
    793793    ) 
    794794 
     
    812812    document.write(gettext('this is to be translated')); 
    813813 
    814 There even is a ``ungettext`` interface and a string interpolation function:: 
    815  
    816     d = { 
    817         count: 10 
    818     }; 
    819     s = interpolate(ungettext('this is %(count)s object', 'this are %(count)s objects', d.count), d); 
    820  
    821 The ``interpolate`` function supports both positional interpolation and named 
    822 interpolation. So the above could have been written as:: 
    823  
    824     s = interpolate(ungettext('this is %s object', 'this are %s objects', 11), [11]); 
    825  
    826 The interpolation syntax is borrowed from Python. You shouldn't go over the top 
    827 with string interpolation, though: this is still JavaScript, so the code will 
    828 have to do repeated regular-expression substitutions. This isn't as fast as 
    829 string interpolation  in Python, so keep it to those cases where you really 
    830 need it (for example, in conjunction with ``ungettext`` to produce proper 
    831 pluralizations). 
     814There is also an ``ngettext`` interface:: 
     815 
     816    var object_cnt = 1 // or 0, or 2, or 3, ... 
     817    s = ngettext('literal for the singular case', 
     818            'literal for the plural case', object_cnt); 
     819 
     820and even a string interpolation function:: 
     821 
     822    function interpolate(fmt, obj, named); 
     823 
     824The interpolation syntax is borrowed from Python, so the ``interpolate`` 
     825function supports both positional and named interpolation: 
     826 
     827    * Positional interpolation: ``obj`` contains a JavaScript Array object 
     828      whose elements values are then sequentially  interpolated in their 
     829      corresponding ``fmt`` placeholders in the same order they appear. 
     830      For example:: 
     831 
     832        fmts = ngettext('There is %s object. Remaining: %s', 
     833                'There are %s objects. Remaining: %s', 11); 
     834        s = interpolate(fmts, [11, 20]); 
     835        // s is 'There are 11 objects. Remaining: 20' 
     836 
     837    * Named interpolation: This mode is selected by passing the optional 
     838      boolean ``named`` parameter as true. ``obj`` contains a JavaScript 
     839      object or associative array. For example:: 
     840 
     841        d = { 
     842            count: 10 
     843            total: 50 
     844        }; 
     845 
     846        fmts = ngettext('Total: %(total)s, there is %(count)s object', 
     847            'there are %(count)s of a total of %(total)s objects', d.count); 
     848        s = interpolate(fmts, d, true); 
     849 
     850You shouldn't go over the top with string interpolation, though: this is still 
     851JavaScript, so the code has to make repeated regular-expression substitutions. 
     852This isn't as fast as string interpolation in Python, so keep it to those 
     853cases where you really need it (for example, in conjunction with ``ngettext`` 
     854to produce proper pluralizations). 
    832855 
    833856Creating JavaScript translation catalogs