diff --git a/trac/admin/console.py b/trac/admin/console.py
|
a
|
b
|
Type: '?' or 'help' for help on command |
| 169 | 169 | # fixup language according to env settings |
| 170 | 170 | if has_babel: |
| 171 | 171 | default = env.config.get('trac', 'default_language', '') |
| 172 | | negotiated = get_negotiated_locale([LANG, default]) |
| | 172 | negotiated = get_negotiated_locale([LANG, default], env.log) |
| 173 | 173 | if negotiated: |
| 174 | | translation.activate(negotiated) |
| | 174 | translation.activate(negotiated, env.path) |
| 175 | 175 | |
| 176 | 176 | ## |
| 177 | 177 | ## Utility methods |
diff --git a/trac/prefs/web_ui.py b/trac/prefs/web_ui.py
|
a
|
b
|
class PreferencesModule(Component): |
| 106 | 106 | } |
| 107 | 107 | |
| 108 | 108 | if Locale: |
| 109 | | locales = map(Locale.parse, get_available_locales()) |
| | 109 | locales = map(Locale.parse, get_available_locales(self.log)) |
| 110 | 110 | languages = sorted([(str(locale).replace('_','-'), |
| 111 | 111 | locale.display_name) for locale in locales]) |
| 112 | 112 | data['locales'] = locales |
diff --git a/trac/util/translation.py b/trac/util/translation.py
|
a
|
b
|
try: |
| 143 | 143 | locale_dir = pkg_resources.resource_filename('trac', 'locale') |
| 144 | 144 | except pkg_resources.ExtractionError: |
| 145 | 145 | return # delay extraction |
| 146 | | except KeyError: |
| 147 | | return # No locale data in egg |
| | 146 | except Exception: |
| | 147 | return |
| 148 | 148 | t = Translations.load(locale_dir, locale or 'en_US') |
| 149 | 149 | if not t or t.__class__ is NullTranslations: |
| 150 | 150 | t = self._null_translations |
| … |
… |
try: |
| 325 | 325 | def get_translations(): |
| 326 | 326 | return translations |
| 327 | 327 | |
| 328 | | def get_available_locales(): |
| | 328 | def get_available_locales(log=None): |
| 329 | 329 | """Return a list of locale identifiers of the locales for which |
| 330 | 330 | translations are available. |
| 331 | 331 | """ |
| 332 | | return [dirname for dirname |
| 333 | | in pkg_resources.resource_listdir('trac', 'locale') |
| 334 | | if '.' not in dirname] |
| | 332 | try: |
| | 333 | locales = [dirname for dirname |
| | 334 | in pkg_resources.resource_listdir('trac', 'locale') |
| | 335 | if '.' not in dirname] |
| | 336 | except Exception: |
| | 337 | locales = [] |
| | 338 | if not locales and log is not None: |
| | 339 | log.warning("Locale data not found") |
| | 340 | return locales |
| | 341 | |
| 335 | 342 | |
| 336 | | def get_negotiated_locale(preferred_locales): |
| | 343 | def get_negotiated_locale(preferred_locales, log=None): |
| 337 | 344 | def normalize(locale_ids): |
| 338 | 345 | return [id.replace('_', '-') for id in locale_ids if id] |
| 339 | 346 | return Locale.negotiate(normalize(preferred_locales), |
| 340 | | normalize(get_available_locales()), sep='-') |
| | 347 | normalize(get_available_locales(log)), sep='-') |
| 341 | 348 | |
| 342 | 349 | has_babel = True |
| 343 | 350 | |
| … |
… |
except ImportError: # fall back on 0.11 |
| 368 | 375 | def get_translations(): |
| 369 | 376 | return translations |
| 370 | 377 | |
| 371 | | def get_available_locales(): |
| | 378 | def get_available_locales(log=None): |
| 372 | 379 | return [] |
| 373 | 380 | |
| 374 | | def get_negotiated_locale(preferred=None, default=None): |
| | 381 | def get_negotiated_locale(preferred=None, log=None): |
| 375 | 382 | return None |
diff --git a/trac/web/main.py b/trac/web/main.py
|
a
|
b
|
class RequestDispatcher(Component): |
| 308 | 308 | preferred = req.session.get('language') |
| 309 | 309 | default = self.env.config.get('trac', 'default_language', '') |
| 310 | 310 | negotiated = get_negotiated_locale([preferred, default] + |
| 311 | | req.languages) |
| | 311 | req.languages, self.log) |
| 312 | 312 | self.log.debug("Negotiated locale: %s -> %s", preferred, negotiated) |
| 313 | 313 | return negotiated |
| 314 | 314 | |