Moved determination of default language into settings.

This commit is contained in:
Dirk Eschler 2010-07-06 09:52:41 +00:00
parent a1bd45eaa9
commit 974503ca0a
5 changed files with 26 additions and 45 deletions

View file

@ -6,8 +6,9 @@ from django.conf import settings
from django.contrib import admin
from django.contrib.contenttypes import generic
from modeltranslation.settings import *
from modeltranslation.translator import translator
from modeltranslation.utils import get_translation_fields, get_default_language
from modeltranslation.utils import get_translation_fields
# Ensure that models are registered for translation before TranslationAdmin
# runs. The import is supposed to resolve a race condition between model import
# and translation registration in production (see issue 19).
@ -28,13 +29,13 @@ class TranslationAdminBase(object):
# For every localized field copy the widget from the original field
if db_field.name in trans_opts.localized_fieldnames_rev:
orig_fieldname = trans_opts.localized_fieldnames_rev[db_field.name]
orig_formfield = self.formfield_for_dbfield( \
self.model._meta.get_field(orig_fieldname),
**kwargs)
orig_formfield = self.formfield_for_dbfield(\
self.model._meta.get_field(orig_fieldname),
**kwargs)
# In case the original form field was required, make the default
# translation field required instead.
if db_field.language == get_default_language() and \
if db_field.language == DEFAULT_LANGUAGE and\
orig_formfield.required:
orig_formfield.required = False
orig_formfield.blank = True
@ -82,8 +83,8 @@ class TranslationAdmin(admin.ModelAdmin, TranslationAdminBase):
display_index = display_new.index(field)
translation_fields = get_translation_fields(field)
editable_new[index:index + 1] = translation_fields
display_new[display_index:display_index + 1] = \
translation_fields
display_new[display_index:display_index + 1] =\
translation_fields
self.list_editable = editable_new
self.list_display = display_new

View file

@ -7,9 +7,8 @@ from django.db.models.fields import Field, CharField
from django.db.models.fields.related import (ForeignKey, OneToOneField,
ManyToManyField)
from modeltranslation.settings import STD_TRANSLATION_FIELDS
from modeltranslation.settings import *
from modeltranslation.utils import (get_language,
get_default_language,
build_localized_fieldname,
build_localized_verbose_name)
@ -93,7 +92,7 @@ class TranslationField(Field):
def pre_save(self, model_instance, add):
val = super(TranslationField, self).pre_save(model_instance, add)
if get_default_language() == self.language and not add:
if DEFAULT_LANGUAGE == self.language and not add:
# Rule is: 3. Assigning a value to a translation field of the
# default language also updates the original field
model_instance.__dict__[self.translated_field.name] = val

View file

@ -3,9 +3,9 @@ from django.conf import settings
from django.core.management.base import (BaseCommand, CommandError,
NoArgsCommand)
from modeltranslation.settings import DEFAULT_LANGUAGE
from modeltranslation.translator import translator
from modeltranslation.utils import (build_localized_fieldname,
get_default_language)
from modeltranslation.utils import build_localized_fieldname
class Command(NoArgsCommand):
@ -13,15 +13,13 @@ class Command(NoArgsCommand):
'translated application using the value of the original field.'
def handle(self, **options):
default_lang = get_default_language()
print "Using default language:", default_lang
print "Using default language:", DEFAULT_LANGUAGE
for model, trans_opts in translator._registry.items():
print "Updating data of model '%s'" % model
for obj in model.objects.all():
for fieldname in trans_opts.fields:
def_lang_fieldname = \
build_localized_fieldname(fieldname, default_lang)
def_lang_fieldname =\
build_localized_fieldname(fieldname, DEFAULT_LANGUAGE)
#print "setting %s from %s to %s." % \
#(def_lang_fieldname, fieldname,
#obj.__dict__[fieldname])

View file

@ -18,7 +18,13 @@ else:
"MODELTRANSLATION_TRANSLATION_REGISTRY "
"setting yet.")
AVAILABLE_LANGUAGES = [l[0] for l in settings.LANGUAGES]
DEFAULT_LANGUAGE = getattr(settings, 'MODELTRANSLATION_DEFAULT_LANGUAGE', None)
if DEFAULT_LANGUAGE and DEFAULT_LANGUAGE not in AVAILABLE_LANGUAGES:
raise ImproperlyConfigured('MODELTRANSLATION_DEFAULT_LANGUAGE not '
'in LANGUAGES setting.')
elif not DEFAULT_LANGUAGE:
DEFAULT_LANGUAGE = AVAILABLE_LANGUAGES[0]
# Only override this setting if you know what you are doing! It merely exist
# to test currently unsupported fields.

View file

@ -6,12 +6,7 @@ from django.contrib.contenttypes.models import ContentType
from django.utils.translation import get_language as _get_language
from django.utils.functional import lazy
from modeltranslation.settings import DEFAULT_LANGUAGE
def get_available_languages():
"""Returns a list of the language codes in settings.LANGUAGES"""
return [l[0] for l in settings.LANGUAGES]
from modeltranslation.settings import *
def get_language():
@ -20,34 +15,16 @@ def get_language():
settings.LANGUAGES (Django does not seem to guarantee this for us).
"""
lang = _get_language()
available_languages = get_available_languages()
if lang not in available_languages and '-' in lang:
if lang not in AVAILABLE_LANGUAGES and '-' in lang:
lang = lang.split('-')[0]
if lang in available_languages:
if lang in AVAILABLE_LANGUAGES:
return lang
return available_languages[0]
def get_default_language():
"""
Returns the language to use as the default language. This is either
the value of settings.MODELTRANSLATION_DEFAULT_LANGUAGE (if it's in the
list of settings.LANGUAGES) or the first item in settings.LANGUAGES.
"""
available_languages = get_available_languages()
default_language = DEFAULT_LANGUAGE
if default_language and default_language not in available_languages:
raise ImproperlyConfigured('MODELTRANSLATION_DEFAULT_LANGUAGE not '
'in LANGUAGES setting.')
if not default_language:
default_language = available_languages[0]
return default_language
return AVAILABLE_LANGUAGES[0]
def get_translation_fields(field):
"""Returns a list of localized fieldnames for a given field."""
return [build_localized_fieldname(field, l) for l in\
get_available_languages()]
return [build_localized_fieldname(field, l) for l in AVAILABLE_LANGUAGES]
def build_localized_fieldname(field_name, lang):