Index: wikinegotiator/negotiator.py =================================================================== --- wikinegotiator/negotiator.py (revision 2412) +++ wikinegotiator/negotiator.py (working copy) @@ -7,8 +7,20 @@ from trac.wiki.web_ui import WikiModule from trac.web.api import IRequestFilter from trac.config import Option +from trac.util.html import Markup from macros import MultiLangTitleIndex +try: + from babel.core import Locale +except: + Locale = None +ctxtimpl = [] +try: + from ctxtnavadd.api import ICtxtnavAdder + ctxtimpl.append(ICtxtnavAdder) +except ImportError: + pass + class WikiNegotiator(Component): _re_page = re.compile(r'(.*)(?:\.([a-z][a-z](?:-[a-z][a-z])?))$') @@ -28,10 +40,14 @@ """Replace requested wiki page name by content negotiation. Nothing changed for non-wiki request. """ + req.handler = handler if isinstance(handler, WikiModule): orig = req.args.get('page', 'WikiStart') # set altered page name page = self._decide_page(req) + name, lang = self._split_lang(page) + req.args['page_name'] = name + req.args['page_langsuffix'] = lang if page != orig: req.args['page'] = page self.env.log.debug('Negotiated: %s' % page) @@ -39,7 +55,6 @@ # page is selected. # TODO: I don't know we should set default language # for base page. - _, lang = self._split_lang(page) req.send_header('Content-Language', lang or self._default_lang) # always send Vary header to tell language negitiation is @@ -158,3 +173,50 @@ # sort by quality descendant infos.sort(lambda x,y: cmp(y[1], x[1])) return [info[0] for info in infos] # returns list of lang string + + implements(*ctxtimpl) + def match_ctxtnav_add(self, req): + return isinstance(req.handler, WikiModule) + + def get_ctxtnav_adds(self, req): + preflangs = self._parse_langs(req.get_header('accept-language') + or self._default_lang) + preflang = len(preflangs) and preflangs[0] or self._default_lang + + curpage = req.args.get('page_name') + if curpage: + curlang = req.args.get('page_langsuffix') + else: + curpage, curlang = self._split_lang(self._decide_page(req)) + if not curlang: + curlang = self._default_lang + defaultYielded = False + for page in WikiSystem(self.env).get_pages(curpage + '.'): + page, lang = self._split_lang(page) + if page == curpage: + if not defaultYielded: + defaultYielded = True + t = self.get_lang_name(self._default_lang) + if self._default_lang == curlang: + t = Markup("" + t + "") + qsa = self._default_lang != preflang and '?lang=' + self._default_lang or '' + yield (req.href.wiki(page) + qsa, t) + t = self.get_lang_name(lang) + if lang == curlang: + t = Markup("" + t + "") + if lang != preflang: + page = page + '.' + lang + yield (req.href.wiki(page), t) + + def get_lang_name(self, name): + if Locale: + try: + return Locale.parse(name, '-').display_name + except: + pass + n = name.split('-', 1)[0] + try: + return Locale.parse(name, '-').display_name + except: + pass + return name Index: wikinegotiator/macros.py =================================================================== --- wikinegotiator/macros.py (revision 2412) +++ wikinegotiator/macros.py (working copy) @@ -32,6 +32,8 @@ 'WikiStart, SandBox', doc="List of page names to be grouped" " in user page.") + _default_lang = Option('wiki', 'default_lang', 'en', + doc="""Language for non-suffixed page.""") def render_macro(self, req, name, content): # get system pages which is author=trac at version 1 @@ -98,7 +100,7 @@ if lang_map.has_key(page): item.append(' (') langs = lang_map[page] - for lang in sorted(langs) + ['other']: + for lang in [self._default_lang] + sorted(langs): p = '%s.%s' % (page, lang) item.append(html.A(lang, href=env.href.wiki(page) + '?lang='+lang, Index: setup.py =================================================================== --- setup.py (revision 2412) +++ setup.py (working copy) @@ -1,3 +1,4 @@ +#!/usr/bin/env python from setuptools import setup PACKAGE = 'TracWikiNegotiator'