Changeset 438
- Timestamp:
- Wed Jul 18 21:48:50 2007
- Files:
-
- subprojects/Wuming/trunk/wuming/test/test_web.py (modified) (diff)
- subprojects/Wuming/trunk/wuming/test/test_i18n.py (added)
- subprojects/Wuming/trunk/wuming/test/test_auth.py (added)
- subprojects/Wuming/trunk/wuming/test/babely.xhtml (added)
- subprojects/Wuming/trunk/wuming/locales (added)
- subprojects/Wuming/trunk/wuming/locales/zh_CN (added)
- subprojects/Wuming/trunk/wuming/locales/zh_CN/LC_MESSAGES (added)
- subprojects/Wuming/trunk/wuming/locales/zh_CN/LC_MESSAGES/messages.mo (added)
- subprojects/Wuming/trunk/wuming/locales/zh_CN/LC_MESSAGES/messages.po (added)
- subprojects/Wuming/trunk/wuming/locales/ja_JP (added)
- subprojects/Wuming/trunk/wuming/locales/ja_JP/LC_MESSAGES (added)
- subprojects/Wuming/trunk/wuming/locales/ja_JP/LC_MESSAGES/foo_test.po (added)
- subprojects/Wuming/trunk/wuming/locales/ja_JP/LC_MESSAGES/messages.mo (added)
- subprojects/Wuming/trunk/wuming/locales/ja_JP/LC_MESSAGES/messages.po (added)
- subprojects/Wuming/trunk/wuming/locales/ja_JP/LC_MESSAGES/foo_test.mo (added)
- subprojects/Wuming/trunk/wuming/locales/en_US (added)
- subprojects/Wuming/trunk/wuming/locales/en_US/LC_MESSAGES (added)
- subprojects/Wuming/trunk/wuming/locales/en_US/LC_MESSAGES/foo_test.po (added)
- subprojects/Wuming/trunk/wuming/locales/en_US/LC_MESSAGES/messages.mo (added)
- subprojects/Wuming/trunk/wuming/locales/en_US/LC_MESSAGES/messages.po (added)
- 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
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 render HTTP(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 render HTTP(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 = translator138 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], None178 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 components203 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 from74 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 error84 85 This is correct implementation of the ITranslationStrategy interface:86 87 >>> from zope.interface.verify import verifyClass, verifyObject88 >>> verifyClass(ITranslationStrategy, AcceptLangStrategy)89 True90 >>> verifyObject(ITranslationStrategy, AcceptLangStrategy(GettextTranslator(None)))91 True92 """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
