~ubuntu-branches/ubuntu/natty/moin/natty-updates

« back to all changes in this revision

Viewing changes to MoinMoin/i18n/__init__.py

  • Committer: Bazaar Package Importer
  • Author(s): Jonas Smedegaard
  • Date: 2008-06-22 21:17:13 UTC
  • mto: This revision was merged to the branch mainline in revision 18.
  • Revision ID: james.westby@ubuntu.com-20080622211713-inlv5k4eifxckelr
ImportĀ upstreamĀ versionĀ 1.7.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
31
31
logging = log.getLogger(__name__)
32
32
 
33
33
from MoinMoin import caching
34
 
from MoinMoin.i18n import strings
35
34
 
36
35
# This is a global for a reason: in persistent environments all languages in
37
36
# use will be cached; Note: you have to restart if you update language data.
40
39
# this gets loaded early and completely:
41
40
languages = None
42
41
 
43
 
# system_pages has a dictionary containing all english
44
 
# system page names and also all translated system pages names as keys,
45
 
# see also wikiutil.isSystemPage:
46
 
system_pages = {}
47
 
 
48
42
translations = {}
49
43
 
50
44
def po_filename(request, language, domain, i18n_dir='i18n'):
66
60
    request.clock.start('i18n_init')
67
61
    if languages is None:
68
62
        logging.debug("trying to load translations from cache")
69
 
        # the scope of the i18n cache needs to be per-wiki, because some translations
70
 
        # have http links (to some help pages) and they must not point to another
71
 
        # wiki in the farm (confusing and maybe not even readable due to ACLs):
72
 
        meta_cache = caching.CacheEntry(request, 'i18n', 'meta', scope='wiki', use_pickle=True)
 
63
        meta_cache = caching.CacheEntry(request, 'i18n', 'meta', scope='farm', use_pickle=True)
73
64
        i18n_dir = os.path.join(request.cfg.moinmoin_dir, 'i18n')
74
65
        if meta_cache.needsUpdate(i18n_dir):
75
66
            logging.debug("cache needs update")
76
67
            _languages = {}
77
 
            _system_pages = {}
78
 
            for pagename in strings.all_pages:
79
 
                _system_pages[pagename] = ('en', pagename)
80
68
            for lang_file in glob.glob(po_filename(request, language='*', domain='MoinMoin')): # XXX only MoinMoin domain for now
81
69
                language, domain, ext = os.path.basename(lang_file).split('.')
82
70
                t = Translation(language, domain)
89
77
                for key, value in t.info.items():
90
78
                    #logging.debug("meta key %s value %r" % (key, value))
91
79
                    _languages[language][key] = value.decode(encoding)
92
 
                for pagename in strings.all_pages:
93
 
                    try:
94
 
                        pagename_translated = t.translation._catalog[pagename]
95
 
                    except KeyError:
96
 
                        pass
97
 
                    else:
98
 
                        _system_pages[pagename_translated] = (language, pagename)
99
80
            logging.debug("dumping language metadata to disk cache")
100
81
            try:
101
 
                meta_cache.update({
102
 
                    'languages': _languages,
103
 
                    'system_pages': _system_pages,
104
 
                })
 
82
                meta_cache.update(_languages)
105
83
            except caching.CacheError:
106
84
                pass
107
85
 
108
86
        if languages is None: # another thread maybe has done it before us
109
87
            try:
110
88
                logging.debug("loading language metadata from disk cache")
111
 
                d = meta_cache.content()
 
89
                _languages = meta_cache.content()
112
90
                if languages is None:
113
 
                    globals().update(d)
 
91
                    languages = _languages
114
92
            except caching.CacheError:
115
93
                pass
116
94
    request.clock.stop('i18n_init')
221
199
 
222
200
    def loadLanguage(self, request, trans_dir="i18n"):
223
201
        request.clock.start('loadLanguage')
224
 
        # see comment about per-wiki scope above
225
 
        cache = caching.CacheEntry(request, arena='i18n', key=self.language, scope='wiki', use_pickle=True)
 
202
        cache = caching.CacheEntry(request, arena='i18n', key=self.language, scope='farm', use_pickle=True)
226
203
        langfilename = po_filename(request, self.language, self.domain, i18n_dir=trans_dir)
227
204
        needsupdate = cache.needsUpdate(langfilename)
228
205
        if not needsupdate:
289
266
    if original in translation.raw:
290
267
        translated = translation.raw[original]
291
268
        if formatted:
292
 
            # it is important to include siteid and percent into the key because
293
 
            # formatted output depends on the (farm) wiki in which the page is
294
 
            # rendered (e.g. for link urls) and also on the percent param
295
 
            key = (original, request.cfg.siteid, percent)
 
269
            key = (original, percent)
296
270
            if key in translation.formatted:
297
271
                translated = translation.formatted[key]
298
272
                if translated is None:
304
278
                translation.formatted[key] = translated # remember it
305
279
    else:
306
280
        try:
307
 
            if languages is None:
308
 
                # languages not initialized yet
309
 
                raise KeyError
310
281
            language = languages[lang]['x-language-in-english']
311
 
            dictpagename = "%sDict" % language.replace(' ', '')
 
282
            dictpagename = "%sDict" % language
312
283
            dicts = request.dicts
313
 
            if dictpagename in dicts:
314
 
                userdict = dicts[dictpagename]
 
284
            if dicts.has_dict(dictpagename):
 
285
                userdict = dicts.dict(dictpagename)
315
286
                translated = userdict[original]
316
287
            else:
317
288
                raise KeyError
319
290
            # do not simply return trans with str, but recursively call
320
291
            # to get english translation, maybe formatted.
321
292
            # if we don't find an english "translation", we just format it
322
 
            # on the fly (this is needed for quickhelp).
 
293
            # on the fly (this is needed for cfg.editor_quickhelp).
323
294
            if lang != 'en':
324
295
                logging.debug("falling back to english, requested string not in %r translation: %r" % (lang, original))
325
296
                translated = getText(original, request, 'en', wiki=formatted, percent=percent)
358
329
    # is available on this wiki...
359
330
    lang = get_browser_language(request)
360
331
    if not lang:
361
 
        available = wikiLanguages() or ["en"]
 
332
        available = wikiLanguages()
362
333
        # Or return the wiki default language...
363
334
        if request.cfg.language_default in available:
364
335
            lang = request.cfg.language_default
387
358
    the request, normalizing to lower case.
388
359
    """
389
360
    fallback = []
390
 
    accepted = request.accept_languages
 
361
    accepted = request.http_accept_language
391
362
    if accepted:
 
363
        # Extract the languages names from the string
 
364
        accepted = accepted.split(',')
 
365
        accepted = [lang.split(';')[0] for lang in accepted]
392
366
        # Add base language for each sub language. If the user specified
393
367
        # a sub language like "en-us", we will try to to provide it or
394
368
        # a least the base language "en" in this case.
395
 
        for lang, quality in accepted:
 
369
        for lang in accepted:
396
370
            lang = lang.lower()
397
371
            fallback.append(lang)
398
372
            if '-' in lang: