20111111
========

browser-specific UI language
----------------------------

Started support for user-specific language selection.
The basic trick is to add 
Django's `LocaleMiddleware` to 
:setting:`MIDDLEWARE_CLASSES`
as described in 
`How Django discovers language preference
<https://docs.djangoproject.com/en/5.2/topics/i18n/translation/#how-django-discovers-language-preference>`_.
This makes Django ask the user's browser's language 
preferences and set `request.LANGUAGE_CODE`.

Until now I thought that was enough...
but it turns out that there are a few places 
where I need to adapt Lino...

First and most evident was that the server must generate not only 
one file :xfile:`lino.js` at startup, but one for each language.
That wasn't too difficult.

Next problem is that :class:`Choice Lists <lino.utils.choicelists.ChoiceList>` trigger 
translation when filling their `choices` list. 

That's subtile! Check-in 20111111 before touching this problem.

After more than 2 hours of my evening I found the solution, 
which is only one line in 
:meth:`lino.utils.choicelists.ChoiceList.display_text`:
Before::

    @classmethod
    def display_text(cls,bc):
        return unicode(bc)
        
After::        

    from django.utils.functional import lazy
    
    @classmethod
    def display_text(cls,bc):
        return lazy(unicode,unicode)(bc)

That is, this method 
now returns a `Promise` of a call to `unicode()` 
and not already the result of a call to `unicode()`.

And another line of code had to change, 
the `__unicode__()` method 
of :class:`lino.modlib.properties.PropertyOccurence` must 
explicitly call unicode on that `Promise`.

As a side-effect, some unit tests needed to change 
because we use now `LocaleMiddleware`: we cannot any longer use 
:func:`lino.utils.babel.set_language` to select the response 
language, instead we must pass a `HTTP_ACCEPT_LANGUAGE` keyword to
Django's `TestCase.client.get()` function.
The unit tests would break again if for some reason 
we'd remove `LocaleMiddleware` again.

Check-in 20111111b.

Another problem was that many labels were converted to unicode in ext_elems 
when creating the UI widgets. 
Solved in check-in 20111111c.

And a last problem (for today) was that in :mod:`lino.modlib.countries.models` 
I used ugettext and not ugettext_lazy for marking translatable strings.

Check-in 20111111d.

Other changes
-------------

While researching for the above solution I did a few internal optimizations:

- The `few_countries` fixture now adds multilingual country names

- New function :func:`lino.utils.codetime` used by :meth:`lino.ui.extjs3.ext_ui.ExtUI.build_lino_js` 
  to avoid recreating the :xfile:`lino.js` files on each 
  server restart.
  Seems to work, but there may be unexpected surprises...


Closing the top-level window
----------------------------

Wenn man das "oberste" Fenster schließt, 
sieht man jetzt nicht mehr wie gewohnt die Erinnerungen, 
sondern nur eine weiße Fläche. Man muss explizit auf 
"Startseite" klicken, um die Erinnerungen anzuzeigen.
Besser wäre, wenn das oberste Fenster gar nicht erst 
einen Close-Button hätte.