Changeset 438

Show
Ignore:
Timestamp:
Wed Jul 18 21:48:50 2007
Author:
djfroofy
Message:

- i18n web integration and testing

Files:

Legend:

Unmodified
Added
Removed
Modified
  • subprojects/Wuming/trunk/wuming/test/test_web.py

    r434 r438  
    1   from wuming.web import BaseResource  
      1 # -*- coding: utf-8 -*-  
      2 from wuming import web  
    2 3  
    3 4 from twisted.web2 import http, http_headers, responsecode, server, resource, stream  
     
    15 16  
    16 17  
    17   class TestRoot(BaseResource):  
      18 class TestRoot(web.BaseResource):  
    17 18     tree = {  
    18               'cont1' : BaseResource({  
      19             'cont1' : web.BaseResource({  
    18 19                 'leaf1' : TestLeaf('A')}),  
    19               'cont2' : BaseResource({  
      20             'cont2' : web.BaseResource({  
    19 20                 'leaf2' : TestLeaf('B'),  
    20 21                 'leaf3' : TestLeaf('C')}),  
     
    56 57  
    57 58  
      59 # An i18n'ed resource  
      60  
      61 import os  
      62 from wuming.i18n import _  
      63 from wuming.templates import wgenshi  
      64  
      65 localedir = os.path.join(os.path.dirname(__file__), os.pardir, 'locales')  
      66  
      67 class Babely(web.TemplateResource):  
      68  
      69     templateLoader = wgenshi.GenshiTemplateLoader([os.path.dirname(__file__)])  
      70     translationStrategy = web.resource_i18n(localedir)  
      71  
      72     def render_context(self, request):  
      73         t = request.translator  
      74         return {  
      75                 'a' : t(_(u'Confirmation')),  
      76                 'b' : t(_(u'Testing'))  
      77                 }  
      78  
      79 babelyResource = web.I18NResourceWrapper(Babely())  
      80  
      81 class I18NTest(web2test.BaseCase):  
      82  
      83     def test_i18nResource(self):  
      84         return self.assertResponse(  
      85             (babelyResource, 'http://host/'),  
      86             (200, {}, '<html>Confirmation Testing</html>'))  
      87  
      88     def test_i18nResourceJA(self):  
      89         return self.assertResponse(  
      90             (babelyResource, 'http://host/', {'Accept-Language' : 'ja,jp;q=0.5'}),  
      91             (200, {}, '<html>確認 実験中</html>'))  
      92  
  • subprojects/Wuming/trunk/wuming/web.py

    r437 r438  
    4 4 from twisted.web2 import resource, log  
    5 5 from twisted.web2 import http, stream, http_headers  
    6   from twisted.web2.iweb import IRequest  
    7   from twisted.python import log  
      6 from twisted.web2.iweb import IRequest, IResource  
      7 from twisted.python import log, components  
    8 8  
    9 9 from wuming.admin import start_modrebuilder  
    10 10 from wuming.interfaces import ITemplateResource, ITemplate, ITemplateLoader, ITemplateGuessingStrategy  
    11   from wuming.interfaces import ITranslationStrategy, ITranslationPreferences  
      11 from wuming.interfaces import ITranslator, ITranslationStrategy, ITranslationPreferences  
    11 11  
    12   from zope.interface import Interface, Attribute, implements  
      12 from zope.interface import Interface, Attribute, implements, implementer  
    12 12  
    13 13  
     
    25 25         self.opts = opts or self.opts or {}  
    26 26      
    27       def renderHTTP(self, request):  
      27     def render(self, request):  
    27 27         return http.Response(404)  
    28 28      
     
    88 88         BaseResource.__init__(self, tree, opts)  
    89 89  
    90       def renderHTTP(self, request):  
      90     def render(self, request):  
    90 90         # FIXME Error checking  
    91 91         # create a new context for the request  
     
    94 94         tpl = self.template  
    95 95         if tpl is None:  
    96               tpl = templateGuessingStrategy.templateName(self, request)  
      96             tpl = self.templateGuessingStrategy.templateName(self, request)  
    96 96         ctx = { 'request' : request, 'view' : self }  
    97 97         ctx.update(self.render_context(request))  
     
    127 127 import weakref  
    128 128  
    129   class LocalizedRequest(object):  
      129 class LocalizedRequestTranslation(object):  
    129 129  
    130 130     implements(ITranslationStrategy)  
     
    136 136  
    137 137     def __init__(self, translator, preferencesFunction=None):  
    138           self.translator = translator  
      138         self.translator = ITranslator(translator)  
    138 138         self.preferences = preferencesFunction or self.preferences  
    139 139  
     
    142 142         """Get the translate function for a request  
    143 143         """  
    144           if request in self._request_cache:  
      144         if request in self._cache:  
    144 144             return self._cache[request]  
    145 145         prefs = self.preferences(request)  
     
    151 151         r = [ langs.extend(t) for t in prefs ]  
    152 152         return self.translator(langs)  
      153          
    153 154  
    154 155  
     
    175 176     items = langs.items()  
    176 177     items.sort(lambda a,b: cmp(b[0], a[0]))  
    177       return [lang for quality, lang in langs], None  
      178     return [lang for quality, lang in items], None  
    177 178  
    178 179 class RequestToTranslationPreferencesAdapter(object):  
     
    200 201         return iter(self.languages)  
    201 202  
    202   from twisted.python import components  
    203 203  
    204 204 components.registerAdapter(RequestToTranslationPreferencesAdapter,  
    205 205         IRequest, ITranslationPreferences)  
    206 206  
      207  
      208 class I18NResourceWrapper(resource.WrapperResource):  
      209  
      210     def __init__(self, resource):  
      211         self.resource = resource  
      212         self.translationStrategy = ITranslationStrategy(resource)  
      213  
      214     def hook(self, request):  
      215         #if self.translationStrategy != resource.translationStrategy:  
      216         #    self.translationStrategy = ITranslationStrategy(resource)  
      217         #strategy = ITranslationStrategy(self.resource)  
      218         # XXX  
      219         request.translator = self.translationStrategy.getTranslator(request)  
      220  
      221  
      222 def resource_i18n(localedir, translatorClass=None):  
      223     """A convenience function for getting the a sensible default translation strategy:  
      224     LocalizedRequestTranslation.  
      225     """  
      226     factory = translatorClass  
      227     if factory is None:  
      228         from wuming.i18n import GettextTranslator  
      229         factory = GettextTranslator  
      230     return LocalizedRequestTranslation(factory(localedir))  
      231  
      232 @implementer(ITranslationStrategy)  
      233 def adaptResourceToTranslationStrategy(resource):  
      234     """Adapt a resource to a provider of ITranslationStrategy  
      235  
      236     >>> class FooResource(resource.Resource):  
      237     ...     translationStrategy = resource_i18n(None)  
      238     ...  
      239     >>> strategy = ITranslationStrategy(FooResource())  
      240     >>> from zope.interface.verify import verifyObject  
      241     >>> verifyObject(ITranslationStrategy, strategy)  
      242     True  
      243     """  
      244     if hasattr(resource, 'translationStrategy') and \  
      245             ITranslationStrategy.providedBy(resource.translationStrategy):  
      246         return resource.translationStrategy  
      247     # Brute force search over properties for a translation strategy  
      248     #for attr in (a in dir(resource) if a[0] != '_'):  
      249     #    v = getattr(resource, attr)  
      250     #    id ITranslationStrategy.providedBy(v)  
      251     #    return v  
      252     raise NotImplemented('Failed adapting resource to ITranslationStrategy')  
      253  
      254 components.registerAdapter(adaptResourceToTranslationStrategy,  
      255         IResource, ITranslationStrategy)  
      256  
    207 257 application = None  
    208 258  
  • subprojects/Wuming/trunk/wuming/i18n.py

    r437 r438  
    70 70 _ = gettext.gettext  
    71 71  
    72   class AcceptLangStrategy(object):  
    73       """This is a ITranslationStrategy implementation that use accept-language from  
    74       request header to find the best translator.  
    75    
    76       You must instantiatiate with a provider of ITranslator.  The following will fail:  
    77    
    78       >>> try:  
    79       ...     strag = AcceptLangStrategy('hello')  
    80       ... except TypeError:  
    81       ...     print 'type error'  
    82       ...  
    83       type error  
    84    
    85       This is correct implementation of the ITranslationStrategy interface:  
    86    
    87       >>> from zope.interface.verify import verifyClass, verifyObject  
    88       >>> verifyClass(ITranslationStrategy, AcceptLangStrategy)  
    89       True  
    90       >>> verifyObject(ITranslationStrategy, AcceptLangStrategy(GettextTranslator(None)))  
    91       True  
    92       """  
    93    
    94       implements(ITranslationStrategy)  
    95    
    96       def __init__(self, translator):  
    97           self.translator = ITranslator(translator)  
    98    
    99       def getTranslator(self, preferences):  
    100           prefs = ITranslationPreferences(preferences)  
    101    
    102 72  
    103 73 from twisted.python import components