# -*- coding: utf-8 -*-
from functools import wraps
def _restore_languages_on_generator_exit(method):
@wraps(method)
def wrapped(self, *args, **kwargs):
stored_languages = self.languages[:]
for language in method(self, *args, **kwargs):
yield language
else:
self.languages[:] = stored_languages
return wrapped
[docs]class BaseLanguageDetector(object):
def __init__(self, languages):
self.languages = languages[:]
@_restore_languages_on_generator_exit
[docs] def iterate_applicable_languages(self, date_string, settings=None, modify=False):
languages = self.languages if modify else self.languages[:]
for language in self._filter_languages(date_string, languages, settings):
yield language
@staticmethod
def _filter_languages(date_string, languages, settings=None):
while languages:
language = languages[0]
if language.is_applicable(date_string, strip_timezone=False, settings=settings):
yield language
elif language.is_applicable(date_string, strip_timezone=True, settings=settings):
yield language
languages.pop(0)
[docs]class AutoDetectLanguage(BaseLanguageDetector):
def __init__(self, languages, allow_redetection=False):
super(AutoDetectLanguage, self).__init__(languages=languages[:])
self.language_pool = languages[:]
self.allow_redetection = allow_redetection
@_restore_languages_on_generator_exit
[docs] def iterate_applicable_languages(self, date_string, modify=False, settings=None):
languages = self.languages if modify else self.languages[:]
initial_languages = languages[:]
for language in self._filter_languages(date_string, languages, settings=settings):
yield language
if not self.allow_redetection:
return
# Try languages that was not tried before with this date_string
languages = [language
for language in self.language_pool
if language not in initial_languages]
if modify:
self.languages = languages
for language in self._filter_languages(date_string, languages, settings=settings):
yield language
[docs]class ExactLanguages(BaseLanguageDetector):
def __init__(self, languages):
if languages is None:
raise ValueError("language cannot be None for ExactLanguages")
super(ExactLanguages, self).__init__(languages=languages)
@_restore_languages_on_generator_exit
[docs] def iterate_applicable_languages(self, date_string, modify=False, settings=None):
for language in super(
ExactLanguages, self).iterate_applicable_languages(
date_string, modify=False, settings=settings):
yield language