Skip to content

Commit

Permalink
Fixed #28636 -- Allowed customizing of translation fallback with sett…
Browse files Browse the repository at this point in the history
…ing LANGUAGE_FALLBACK

Thanks Claude Paroz and Dhia Abbasi for the reviews and good ideas.
  • Loading branch information
denisiko committed Oct 5, 2017
1 parent 6da1407 commit faeb8a4
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 7 deletions.
4 changes: 4 additions & 0 deletions django/conf/global_settings.py
Expand Up @@ -47,6 +47,10 @@ def gettext_noop(s):
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en-us'

# Language code for translation fallback, which is LANGUAGE_CODE by default.
# Set this as fallback for unsupported languages and missing translations.
LANGUAGE_FALLBACK = LANGUAGE_CODE

# Languages we provide translations for, out of the box.
LANGUAGES = [
('af', gettext_noop('Afrikaans')),
Expand Down
2 changes: 1 addition & 1 deletion django/middleware/locale.py
Expand Up @@ -21,7 +21,7 @@ def process_request(self, request):
language = translation.get_language_from_request(request, check_path=i18n_patterns_used)
language_from_path = translation.get_language_from_path(request.path_info)
if not language_from_path and i18n_patterns_used and not prefixed_default_language:
language = settings.LANGUAGE_CODE
language = translation.get_fallback()
translation.activate(language)
request.LANGUAGE_CODE = translation.get_language()

Expand Down
4 changes: 4 additions & 0 deletions django/utils/translation/__init__.py
Expand Up @@ -189,6 +189,10 @@ def get_language_bidi():
return _trans.get_language_bidi()


def get_fallback():
return _trans.get_fallback()


def check_for_language(lang_code):
return _trans.check_for_language(lang_code)

Expand Down
23 changes: 17 additions & 6 deletions django/utils/translation/trans_real.py
Expand Up @@ -178,16 +178,19 @@ def _add_local_translations(self):

def _add_fallback(self, localedirs=None):
"""Set the GNUTranslations() fallback with the default language."""
# Don't set a fallback for the default language or any English variant
fallback = get_fallback()
# Don't set a fallback for any default language variant or any English variant
# (as it's empty, so it'll ALWAYS fall back to the default language)
if self.__language == settings.LANGUAGE_CODE or self.__language.startswith('en'):
# If the language and fallback are the same, there's no need for adding a fallback.
if self.__language == fallback or self.__language.startswith(
settings.LANGUAGE_CODE[0:2]) or self.__language.startswith('en'):
return
if self.domain == 'django':
# Get from cache
default_translation = translation(settings.LANGUAGE_CODE)
default_translation = translation(fallback)
else:
default_translation = DjangoTranslation(
settings.LANGUAGE_CODE, domain=self.domain, localedirs=localedirs
fallback, domain=self.domain, localedirs=localedirs
)
self.add_fallback(default_translation)

Expand Down Expand Up @@ -278,6 +281,14 @@ def get_language_bidi():
return base_lang in settings.LANGUAGES_BIDI


def get_fallback():
"""
Return the fallback language for unsupported languages and missing translations.
"""
fallback = settings.LANGUAGE_FALLBACK
return fallback if fallback and isinstance(fallback, str) else settings.LANGUAGE_CODE


def catalog():
"""
Return the current active catalog for further processing.
Expand Down Expand Up @@ -504,9 +515,9 @@ def get_language_from_request(request, check_path=False):
continue

try:
return get_supported_language_variant(settings.LANGUAGE_CODE)
return get_supported_language_variant(get_fallback())
except LookupError:
return settings.LANGUAGE_CODE
return get_fallback()


def parse_accept_lang_header(lang_string):
Expand Down

0 comments on commit faeb8a4

Please sign in to comment.