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'