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 `_. 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 ` 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.