Changeset 442
- Timestamp:
- Wed Aug 1 13:33:16 2007
- Files:
-
- subprojects/Wuming/trunk/wuming/test/test_web.py (modified) (diff)
- subprojects/Wuming/trunk/wuming/web.py (modified) (diff)
- subprojects/Wuming/trunk/wuming/i18n.py (modified) (diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
subprojects/Wuming/trunk/wuming/test/test_web.py
r438 r442 15 15 return http.Response(responsecode.OK, stream=stream.MemoryStream(self.data)) 16 16 17 18 17 class TestRoot(web.BaseResource): 19 18 tree = { … … 61 60 import os 62 61 from wuming.i18n import _ 62 from wuming import i18n 63 63 from wuming.templates import wgenshi 64 64 … … 68 68 69 69 templateLoader = wgenshi.GenshiTemplateLoader([os.path.dirname(__file__)]) 70 translationStrategy = web.resource_i18n(localedir)70 translationStrategy = i18n.resource_i18n(localedir) 70 70 71 71 def render_context(self, request): … … 77 77 } 78 78 79 babelyResource = web.I18NResourceWrapper(Babely())79 babelyResource = i18n.I18NResourceWrapper(Babely()) 79 79 80 80 class I18NTest(web2test.BaseCase): -
subprojects/Wuming/trunk/wuming/web.py
r441 r442 126 126 127 127 128 129 import weakref130 131 class LocalizedRequestTranslation(object):132 133 implements(ITranslationStrategy)134 135 _cache = weakref.WeakKeyDictionary()136 137 preferences = lambda self, r: None138 139 def __init__(self, translator, preferencesFunction=None):140 self.translator = ITranslator(translator)141 self.preferences = preferencesFunction or self.preferences142 143 def getTranslator(self, request):144 """Get the translate function for a request145 """146 if request in self._cache:147 return self._cache[request]148 prefs = self.preferences(request)149 if prefs is None:150 prefs = ITranslationPreferences(request)151 # ???152 langs = []153 r = [ langs.extend(t) for t in prefs ]154 return self.translator(langs)155 156 157 158 def languagesDomainFactory(s, request):159 header = request.headers.getHeader('accept-language')160 if header is None:161 return [], None162 langs = {}163 for lang in header.split(','):164 quality = 1.0165 if ';' in lang:166 lang, quality = lang.split(';', 1)167 if quality[:2] == 'q=':168 try:169 quality = float(quality[2:])170 except ValueError:171 pass172 #langs.append((quality, lang))173 t = langs.get(quality, ())174 t = langs[quality] = t + (lang,)175 if '-' in lang:176 #langs.append((quality, lang.split('-')[0]))177 langs[quality] = t + (lang.split('-')[0],)178 items = langs.items()179 items.sort(lambda a,b: cmp(b[0], a[0]))180 return [lang for quality, lang in items], None181 182 class RequestToTranslationPreferencesAdapter(object):183 """I adapt an http request to an ITranslationPreferences184 185 >>> from twisted.web2.http import Request186 >>> from twisted.web2 import http_headers187 >>> r = Request(None, 'GET', 'http://host/', 'HTTP/1.1', 0, http_headers.Headers())188 >>> prefs = ITranslationPreferences(r)189 190 """191 implements(ITranslationPreferences)192 193 languagesDomainFactory = languagesDomainFactory194 195 def __init__(self, request):196 self.languages, self.domain = self.languagesDomainFactory(request)197 198 def __iter__(self):199 return iter(self.languages)200 201 202 components.registerAdapter(RequestToTranslationPreferencesAdapter,203 IRequest, ITranslationPreferences)204 205 206 class I18NResourceWrapper(resource.WrapperResource):207 208 def __init__(self, resource):209 self.resource = resource210 self.translationStrategy = ITranslationStrategy(resource)211 212 def hook(self, request):213 #if self.translationStrategy != resource.translationStrategy:214 # self.translationStrategy = ITranslationStrategy(resource)215 #strategy = ITranslationStrategy(self.resource)216 # XXX217 request.translator = self.translationStrategy.getTranslator(request)218 219 220 def resource_i18n(localedir, translatorClass=None):221 """A convenience function for getting the a sensible default translation strategy:222 LocalizedRequestTranslation.223 """224 factory = translatorClass225 if factory is None:226 from wuming.i18n import GettextTranslator227 factory = GettextTranslator228 return LocalizedRequestTranslation(factory(localedir))229 230 @implementer(ITranslationStrategy)231 def adaptResourceToTranslationStrategy(resource):232 """Adapt a resource to a provider of ITranslationStrategy233 234 >>> class FooResource(resource.Resource):235 ... translationStrategy = resource_i18n(None)236 ...237 >>> strategy = ITranslationStrategy(FooResource())238 >>> from zope.interface.verify import verifyObject239 >>> verifyObject(ITranslationStrategy, strategy)240 True241 """242 if hasattr(resource, 'translationStrategy') and \243 ITranslationStrategy.providedBy(resource.translationStrategy):244 return resource.translationStrategy245 # Brute force search over properties for a translation strategy246 #for attr in (a in dir(resource) if a[0] != '_'):247 # v = getattr(resource, attr)248 # id ITranslationStrategy.providedBy(v)249 # return v250 raise NotImplementedError('Failed adapting resource to ITranslationStrategy')251 252 components.registerAdapter(adaptResourceToTranslationStrategy,253 IResource, ITranslationStrategy)254 255 128 application = None 256 129 -
subprojects/Wuming/trunk/wuming/i18n.py
r441 r442 5 5 6 6 from wuming.interfaces import ITranslator, ITranslationStrategy, ITranslationPreferences 7 8 from zope.interface import Interface, implements, classImplements 7 from zope.interface import Interface, implements, implementer, classImplements 9 8 10 9 import gettext … … 103 102 components.registerAdapter(ListAdapter, IList, ITranslationPreferences) 104 103 104 ############################################################################### 105 # web2 glue 106 107 from twisted.web2 import resource 108 from twisted.web2.iweb import IRequest, IResource 109 import weakref 110 111 class LocalizedRequestTranslation(object): 112 113 implements(ITranslationStrategy) 114 115 _cache = weakref.WeakKeyDictionary() 116 117 preferences = lambda self, r: None 118 119 def __init__(self, translator, preferencesFunction=None): 120 self.translator = ITranslator(translator) 121 self.preferences = preferencesFunction or self.preferences 122 123 def getTranslator(self, request): 124 """Get the translate function for a request 125 """ 126 if request in self._cache: 127 return self._cache[request] 128 prefs = self.preferences(request) 129 if prefs is None: 130 prefs = ITranslationPreferences(request) 131 # ??? 132 langs = [] 133 r = [ langs.extend(t) for t in prefs ] 134 return self.translator(langs) 135 136 137 138 def languagesDomainFactory(s, request): 139 header = request.headers.getHeader('accept-language') 140 if header is None: 141 return [], None 142 langs = {} 143 for lang in header.split(','): 144 quality = 1.0 145 if ';' in lang: 146 lang, quality = lang.split(';', 1) 147 if quality[:2] == 'q=': 148 try: 149 quality = float(quality[2:]) 150 except ValueError: 151 pass 152 #langs.append((quality, lang)) 153 t = langs.get(quality, ()) 154 t = langs[quality] = t + (lang,) 155 if '-' in lang: 156 #langs.append((quality, lang.split('-')[0])) 157 langs[quality] = t + (lang.split('-')[0],) 158 items = langs.items() 159 items.sort(lambda a,b: cmp(b[0], a[0])) 160 return [lang for quality, lang in items], None 161 162 class RequestToTranslationPreferencesAdapter(object): 163 """I adapt an http request to an ITranslationPreferences 164 165 >>> from twisted.web2.http import Request 166 >>> from twisted.web2 import http_headers 167 >>> r = Request(None, 'GET', 'http://host/', 'HTTP/1.1', 0, http_headers.Headers()) 168 >>> prefs = ITranslationPreferences(r) 169 170 """ 171 implements(ITranslationPreferences) 172 173 languagesDomainFactory = languagesDomainFactory 174 175 def __init__(self, request): 176 self.languages, self.domain = self.languagesDomainFactory(request) 177 178 def __iter__(self): 179 return iter(self.languages) 180 181 182 components.registerAdapter(RequestToTranslationPreferencesAdapter, 183 IRequest, ITranslationPreferences) 184 185 186 class I18NResourceWrapper(resource.WrapperResource): 187 188 def __init__(self, resource): 189 self.resource = resource 190 self.translationStrategy = ITranslationStrategy(resource) 191 192 def hook(self, request): 193 #if self.translationStrategy != resource.translationStrategy: 194 # self.translationStrategy = ITranslationStrategy(resource) 195 #strategy = ITranslationStrategy(self.resource) 196 # XXX 197 request.translator = self.translationStrategy.getTranslator(request) 198 199 200 def resource_i18n(localedir, translatorClass=None): 201 """A convenience function for getting the a sensible default translation strategy: 202 LocalizedRequestTranslation. 203 """ 204 factory = translatorClass 205 if factory is None: 206 factory = GettextTranslator 207 return LocalizedRequestTranslation(factory(localedir)) 208 209 @implementer(ITranslationStrategy) 210 def adaptResourceToTranslationStrategy(resource): 211 """Adapt a resource to a provider of ITranslationStrategy 212 213 >>> class FooResource(resource.Resource): 214 ... translationStrategy = resource_i18n(None) 215 ... 216 >>> strategy = ITranslationStrategy(FooResource()) 217 >>> from zope.interface.verify import verifyObject 218 >>> verifyObject(ITranslationStrategy, strategy) 219 True 220 """ 221 if hasattr(resource, 'translationStrategy') and \ 222 ITranslationStrategy.providedBy(resource.translationStrategy): 223 return resource.translationStrategy 224 # Brute force search over properties for a translation strategy 225 #for attr in (a in dir(resource) if a[0] != '_'): 226 # v = getattr(resource, attr) 227 # id ITranslationStrategy.providedBy(v) 228 # return v 229 raise NotImplementedError('Failed adapting resource to ITranslationStrategy') 230 231 components.registerAdapter(adaptResourceToTranslationStrategy, 232 IResource, ITranslationStrategy) 105 233
