# -*- coding: utf-8 -*- """ Python API for language and translation management. """ from collections import namedtuple from django.conf import settings from django.utils.translation import get_language from dark_lang.models import DarkLangConfig # Named tuples can be referenced using object-like variable # deferencing, making the use of tuples more readable by # eliminating the need to see the context of the tuple packing. Language = namedtuple('Language', 'code name') def released_languages(): """Retrieve the list of released languages. Constructs a list of Language tuples by intersecting the list of valid language tuples with the list of released language codes. Returns: list of Language: Languages in which full translations are available. Example: >>> print released_languages() [Language(code='en', name=u'English'), Language(code='fr', name=u'Français')] """ released_language_codes = DarkLangConfig.current().released_languages_list default_language_code = settings.LANGUAGE_CODE if default_language_code not in released_language_codes: released_language_codes.append(default_language_code) released_language_codes.sort() # Intersect the list of valid language tuples with the list # of release language codes released_languages = [ Language(tuple[0], tuple[1]) for tuple in settings.LANGUAGES if tuple[0] in released_language_codes ] return released_languages def preferred_language(preferred_language_code): """Retrieve the name of the user's preferred language. Note: The preferred_language_code may be None. If this is the case, the if/else block will handle it by returning either the active language or the default language. Args: preferred_language_code (str): The ISO 639 code corresponding to the user's preferred language. Returns: unicode: The name of the user's preferred language. """ active_language_code = get_language() if preferred_language_code in settings.LANGUAGE_DICT: # If the user has indicated a preference for a valid # language, record their preferred language pass elif active_language_code in settings.LANGUAGE_DICT: # Otherwise, set the language used in the current thread # as the preferred language preferred_language_code = active_language_code else: # Otherwise, use the default language preferred_language_code = settings.LANGUAGE_CODE preferred_language = settings.LANGUAGE_DICT[preferred_language_code] return Language(preferred_language_code, preferred_language)