Skip to content

Commit 0d5e5ce

Browse files
committed
Small fix to ensure get_locale() always returns a Locale object. Fixes #213.
1 parent 6ae4e08 commit 0d5e5ce

File tree

4 files changed

+28
-31
lines changed

4 files changed

+28
-31
lines changed

flask_babel/__init__.py

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from contextlib import contextmanager
1515
from typing import List, Callable, Optional
1616

17+
from babel.support import Translations, NullTranslations
1718
from flask import current_app, g
1819
from flask.helpers import locked_cached_property
1920
from babel import dates, numbers, support, Locale
@@ -236,40 +237,41 @@ def _resolve_directories(directories: List[str], app=None):
236237
yield os.path.join(app.root_path, path)
237238

238239

239-
def get_translations():
240+
def get_translations() -> Translations | NullTranslations:
240241
"""Returns the correct gettext translations that should be used for
241242
this request. This will never fail and return a dummy translation
242243
object if used outside the request or if a translation cannot be found.
243244
"""
244245
return get_domain().get_translations()
245246

246247

247-
def get_locale():
248+
def get_locale() -> Optional[Locale]:
248249
"""Returns the locale that should be used for this request as
249250
`babel.Locale` object. This returns `None` if used outside a request.
250251
"""
251252
ctx = _get_current_context()
252253
if ctx is None:
253254
return None
255+
254256
locale = getattr(ctx, 'babel_locale', None)
255257
if locale is None:
256258
babel = get_babel()
257259
if babel.locale_selector is None:
258-
locale = babel.default_locale
260+
locale = babel.instance.default_locale
259261
else:
260262
rv = babel.locale_selector()
261263
if rv is None:
262-
locale = babel.default_locale
264+
locale = babel.instance.default_locale
263265
else:
264266
locale = Locale.parse(rv)
265267
ctx.babel_locale = locale
268+
266269
return locale
267270

268271

269-
def get_timezone():
272+
def get_timezone() -> Optional[timezone]:
270273
"""Returns the timezone that should be used for this request as
271-
`pytz.timezone` object. This returns `None` if used outside of
272-
a request.
274+
a `pytz.timezone` object. This returns `None` if used outside a request.
273275
"""
274276
ctx = _get_current_context()
275277
tzinfo = getattr(ctx, 'babel_tzinfo', None)
@@ -345,7 +347,7 @@ def force_locale(locale):
345347
setattr(ctx, key, value)
346348

347349

348-
def _get_format(key, format):
350+
def _get_format(key, format) -> Optional[str]:
349351
"""A small helper for the datetime formatting functions. Looks up
350352
format defaults for different kinds.
351353
"""
@@ -469,7 +471,7 @@ def _date_format(formatter, obj, format, rebase, **extra):
469471
return formatter(obj, format, locale=locale, **extra)
470472

471473

472-
def format_number(number):
474+
def format_number(number) -> str:
473475
"""Return the given number formatted for the locale in request
474476
475477
:param number: the number to format
@@ -480,7 +482,7 @@ def format_number(number):
480482
return numbers.format_decimal(number, locale=locale)
481483

482484

483-
def format_decimal(number, format=None):
485+
def format_decimal(number, format=None) -> str:
484486
"""Return the given decimal number formatted for the locale in the request.
485487
486488
:param number: the number to format
@@ -493,7 +495,7 @@ def format_decimal(number, format=None):
493495

494496

495497
def format_currency(number, currency, format=None, currency_digits=True,
496-
format_type='standard'):
498+
format_type='standard') -> str:
497499
"""Return the given number formatted for the locale in the request.
498500
499501
:param number: the number to format
@@ -517,7 +519,7 @@ def format_currency(number, currency, format=None, currency_digits=True,
517519
)
518520

519521

520-
def format_percent(number, format=None):
522+
def format_percent(number, format=None) -> str:
521523
"""Return formatted percent value for the locale in the request.
522524
523525
:param number: the number to format
@@ -529,7 +531,7 @@ def format_percent(number, format=None):
529531
return numbers.format_percent(number, format=format, locale=locale)
530532

531533

532-
def format_scientific(number, format=None):
534+
def format_scientific(number, format=None) -> str:
533535
"""Return value formatted in scientific notation for the locale in request
534536
535537
:param number: the number to format
@@ -723,17 +725,17 @@ def lazy_pgettext(self, context, string, **variables):
723725
return LazyString(self.pgettext, context, string, **variables)
724726

725727

726-
def _get_current_context():
728+
def _get_current_context() -> Optional[SimpleNamespace]:
727729
if not g:
728730
return None
729731

730732
if not hasattr(g, "_flask_babel"):
731733
g._flask_babel = SimpleNamespace()
732734

733-
return g._flask_babel
735+
return g._flask_babel # noqa
734736

735737

736-
def get_domain():
738+
def get_domain() -> Domain:
737739
ctx = _get_current_context()
738740
if ctx is None:
739741
# this will use NullTranslations
@@ -749,36 +751,36 @@ def get_domain():
749751

750752

751753
# Create shortcuts for the default Flask domain
752-
def gettext(*args, **kwargs):
754+
def gettext(*args, **kwargs) -> str:
753755
return get_domain().gettext(*args, **kwargs)
754756

755757

756758
_ = gettext
757759

758760

759-
def ngettext(*args, **kwargs):
761+
def ngettext(*args, **kwargs) -> str:
760762
return get_domain().ngettext(*args, **kwargs)
761763

762764

763-
def pgettext(*args, **kwargs):
765+
def pgettext(*args, **kwargs) -> str:
764766
return get_domain().pgettext(*args, **kwargs)
765767

766768

767-
def npgettext(*args, **kwargs):
769+
def npgettext(*args, **kwargs) -> str:
768770
return get_domain().npgettext(*args, **kwargs)
769771

770772

771-
def lazy_gettext(*args, **kwargs):
773+
def lazy_gettext(*args, **kwargs) -> LazyString:
772774
return LazyString(gettext, *args, **kwargs)
773775

774776

775-
def lazy_pgettext(*args, **kwargs):
777+
def lazy_pgettext(*args, **kwargs) -> LazyString:
776778
return LazyString(pgettext, *args, **kwargs)
777779

778780

779-
def lazy_ngettext(*args, **kwargs):
781+
def lazy_ngettext(*args, **kwargs) -> LazyString:
780782
return LazyString(ngettext, *args, **kwargs)
781783

782784

783-
def lazy_npgettext(*args, **kwargs):
785+
def lazy_npgettext(*args, **kwargs) -> LazyString:
784786
return LazyString(npgettext, *args, **kwargs)

tests/test_integration.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from __future__ import with_statement
2-
31
import pickle
42

53
import flask

tests/test_multiple_apps.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ def test_multiple_apps():
1212
b.init_app(app2, default_locale='en_US')
1313

1414
with app1.test_request_context():
15-
assert babel.get_locale() == 'de_DE'
15+
assert str(babel.get_locale()) == 'de_DE'
1616
assert babel.gettext(u'Hello %(name)s!', name='Peter') == \
1717
'Hallo Peter!'
1818

1919
with app2.test_request_context():
20-
assert babel.get_locale() == 'en_US'
20+
assert str(babel.get_locale()) == 'en_US'
2121
assert babel.gettext(u'Hello %(name)s!', name='Peter') == \
2222
'Hello Peter!'

tests/test_number_formatting.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
# -*- coding: utf-8 -*-
2-
from __future__ import with_statement
3-
41
from decimal import Decimal
52

63
import flask

0 commit comments

Comments
 (0)