Hello,

OK, I found out the issues, and came up with a solution, if any one cares :)

Requirements:

- A get_request patch
- A REQUEST object that will have the necessary information to locaize from 
(language code, etc ...)

How I do it:

- Copy Python lib's locale.py to your product
- import Globals
- Force "locale emulation", I do it by raising an ImportError when importing 
_locale
- Hardcode the dicts that contain the usual localconv() output for the locales 
you're interested in
- Edit the localeconv() emulation to get the request, and from there get the 
localization information somehow (I base it on HTTP_ACCEPT_LANGUAGE for 
example), and then return the dict information.
- import locale in __init__.py

Works great for me, and was pretty straightforward.

Notes:

- You might be able to do this through monkey patching ... I copy the module 
because I'm using 2.5's locale module with 2.4 ... To get currency() support.
- You might want to put Module security declarations in there somewhere.
- Nice benefit that you can easily change the number/currency parameters to 
your liking, if needed.

Some code (Sorry can't just share/open source it all, due to my employer's 
policies):

<...>
# Zope imports
import Globals
from Products.CMFCore.utils import getToolByName
<...>
try:

    # from _locale import *
    raise ImportError

except ImportError:

    # Locale emulation
<...>
    def localeconv():
        """ localeconv() -> dict.
            Returns numeric and monetary locale-specific parameters.
        """
        request = Globals.get_request()
        portal_localizer = getToolByName(request.get('PUBLISHED'), 
'portal_localizer')
        locale_suffix = portal_localizer.getProperty('locale_suffix')
        return LOCALECONV[request.get('HTTP_ACCEPT_LANGUAGE', 'en') + 
locale_suffix]
<...>
LOCALECONV = {'en_CA':
              {'mon_decimal_point': '.',
               'int_frac_digits': 2,
               'p_sep_by_space': 0,
               'frac_digits': 2,
               'thousands_sep': ',',
               'n_sign_posn': 1,
               'decimal_point': '.',
               'int_curr_symbol': 'CAD ',
               'n_cs_precedes': 1,
               'p_sign_posn': 1,
               'mon_thousands_sep': ',',
               'negative_sign': '-',
               'currency_symbol': '$',
               'n_sep_by_space': 0,
               'mon_grouping': [3, 3, 0],
               'p_cs_precedes': 1,
               'positive_sign': '',
               'grouping': [3, 3, 0]},
              'fr_CA':
              {'mon_decimal_point': ',',
               'int_frac_digits': 2,
               'p_sep_by_space': 1,
               'frac_digits': 2,
               'thousands_sep': ' ',
               'n_sign_posn': 0,
               'decimal_point': ',',
               'int_curr_symbol': 'CAD ',
               'n_cs_precedes': 0,
               'p_sign_posn': 1,
               'mon_thousands_sep': ' ',
               'negative_sign': '-',
               'currency_symbol': '$',
               'n_sep_by_space': 1,
               'mon_grouping': [3, 3, 0],
               'p_cs_precedes': 0,
               'positive_sign': '',
               'grouping': []}
             }
</...>

Hope this comes in handy to someone!

J.F.

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Doyon, 
Jean-Francois
Sent: December 14, 2006 9:23 AM
To: zope@zope.org
Subject: [Zope] Zope, setlocale(), requests and traversal

Hello,

I know there is a locale setting in etc/zope.conf, and I make use of it.

The problem now, is that I have a multilingual site that I would like to have 
support multiple locales, per request:  One request could be for the french 
site and content, using the fr_CA locale in my case, but another could be for 
english, and en_CA ... Localization is done through a traversal hook.

So right now I call setlocale() on a per request basis, and it works fine in 
development.

So I'm wondering:

- I see the docs mention setlocale might not be threadsafe, since Zope is 
threaded, anyone know the implications?
- If I call setlocale() during traversal, could that setting affect other 
threads/requests?
- If the above 2 are indeed problems, is there some nice way to do set 
per-request locales, short of completely implementing a custom way of doing it?

Thanks!

Jean-François Doyon
Internet Service Development and Systems Support / Spécialiste de 
dèveloppements internet et soutien technique Canada Centre for Remote 
Sensing/Centre Canadien de télédétection Natural Resources Canada/Ressources 
Naturelles Canada http://atlas.gc.ca
Tel./Tél.: (613) 992-4902
Fax: (613) 947-2410
_______________________________________________
Zope maillist  -  Zope@zope.org
http://mail.zope.org/mailman/listinfo/zope
**   No cross posts or HTML encoding!  **
(Related lists -
 http://mail.zope.org/mailman/listinfo/zope-announce
 http://mail.zope.org/mailman/listinfo/zope-dev )
_______________________________________________
Zope maillist  -  Zope@zope.org
http://mail.zope.org/mailman/listinfo/zope
**   No cross posts or HTML encoding!  **
(Related lists -
 http://mail.zope.org/mailman/listinfo/zope-announce
 http://mail.zope.org/mailman/listinfo/zope-dev )

Reply via email to