Django I18N in messages und json

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Hallo zusammen,
ich habe hier eine django Anwendung, die Übersetzungen benutzt. Das funktioniert auch alles wunderbar, ausser in zwei Fällen:
  • 1. Antworten auf JSON requests (jquery $.post(...) Anfrage).
  • 2. Strings die über django.contrib.messages verschickt werden.
Ich habe in beiden Fällen ugettext und ugettext_lazy probiert, aber leider hilft es nicht. Ich habe auch geprüft, ob der Browser in jquery Anfragen den Accept-Language Header korrekt setzt. Tut er.

Hatte jemand schon mal das Problem oder mache ich nur etwas grundlegendes falsch?

Gruß
Whitie
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

gib doch einfach mal aus, welche Sprache beim AJAX Request wirklich aktiv ist.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Also er gibt de aus für request.LANGUAGE_CODE. Das stimmt ja. Wieso sucht er dann die Übersetzungen nicht raus?

Und was könnte mit django.contrib.messages nicht stimmen?

Gruß
Whitie
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

So, ich hab jetzt mal probiert, die Sprache explizit zu aktivieren (django.utils.translation.activate). Das hilft aber auch nicht weiter. Die beiden o. g. Fälle werden nicht übersetzt. Hab auch schon die Position der LocaleMiddleware hin und her getauscht. Bringt auch nichts.

Gruß
Whitie
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Vlt magst du auch mal etwas Code herzeigen anstatt so abstrakte Fragen zu stellen?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Pack doch mal im betreffenden view gettext Ausgaben mit rein.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Also, hier mal ein paar relevante Codestellen:

Code: Alles auswählen

# settings.py
LANGUAGE_CODE = 'de-de'
USE_I18N = True
MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'audit_log.middleware.UserLoggingMiddleware',
)

# utils.py

from django.utils import translation

# original
def json_view(func):
    def wrap(req, *args, **kw):
        response = func(req, *args, **kw)
        json = simplejson.dumps(response)
        return HttpResponse(json, mimetype='application/json')
    return wrap

# nach Jens Post
def json_view(func):
    def wrap(req, *args, **kw):
        translation.activate(req.LANGUAGE_CODE)
        print req.LANGUAGE_CODE # ergibt de
        response = func(req, *args, **kw)
        json = simplejson.dumps(response)
        return HttpResponse(json, mimetype='application/json')
    return wrap

# views.py

from django.utils.translation import ugettext as _
from django.contrib import messages

@login_required
def ask_order(req):
    if req.method == 'POST':
        form = OrderOldForm(req.POST)
        if form.is_valid():
            return redirect('orders-order', form.cleaned_data['article_id'])
        else:
            messages.error(req, _(u'Please give a valid article ID.')) # wird nicht übersetzt
    else:
        form = OrderOldForm()
    articles = [(x.id, x.name, x.short_desc()) for x in
                Article.objects.all().order_by('name')]
    ctx = dict(page_title=_(u'Orders'), form=form, menus=menus,
        articles=articles)
    return render(req, 'orders/select_article.html', ctx)

@json_view
def update_article_count(req, order_id, count):
    order_id, count = int(order_id), int(count)
    order = Order.objects.select_related().get(id=order_id)
    old_count = order.count
    order.count = count
    try:
        u = order.users.get(id=req.user.id)
    except:
        order.users.add(req.user)
    order.save()
    msg = _(u'Count for %(name)s was changed from %(old)d to %(count)d.' %
        {'name': order.article.name, 'old': old_count, 'count': count}) # wird nicht übersetzt
    user = [x.username for x in order.users.all()]
    return dict(msg=msg, user=u', '.join(user))

Ich hoffe, ich habe nichts vergessen. Alles andere wird anstandslos übersetzt (verbose_name in Models, label in Forms, alles in Templates).

Gruß
Whitie

Edit: Die Übersetzungen sind natürlich auch alle vorhanden und in .mo Dateien kompiliert, es wird also alles korrekt extrahiert.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Pack doch debug ausgaben direkt in update_article_count() rein. Vielleicht dort auch msg ausgeben.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Hallo Jens,
danke für deine Mühe.

Ich hab jetzt mal ein paar print statements (print _(u'...')) eingefügt. Meintest du das? Die werden jedenfalls auch nicht übersetzt. Ich hab auch mal das ganze translation.activate('de') aus dem Dekorator direkt in den view verschoben. Bringt auch nichts. request.LANGUAGE_CODE liefert aber nach wie vor 'de'.

Ich werde wohl fürs erste sämtliche Meldungen durch deutsche Strings ersetzen, da die Anwendung schon benutzt wird und einige Kollegen kein Englisch können. Schön ist das aber nicht.

Hat sonst noch jemand Ideen?

Viele Grüße
Whitie
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

So, ich habe jetzt alle Stellen, die das messages Framework benutzen und alle json Funktionen erstmal mit deutschen Zeichenketten im Quelltext versehen. Wäre also immer noch für jeden Tipp dankbar.

Viele Grüße
Whitie
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Hallo zusammen,
ich möchte meinen alten Thread nochmal rauskramen. Ich sitze z. Z. am nächsten Django Projekt und musste feststellen, dass das Problem immer noch (teilweise) aktuell ist. Das messages Framework übersetzt jetzt zuverlässig, aber ich bekomme in Views, die JSON zurückgeben, keine Übersetzungen zustande. Gibt es da inzwischen einen Trick?

Das Beispiel aus der alten Anwendung gilt weiterhin. Benutzt wird Django 1.10.4 und Python 3.4.2.

Viele Grüße
Whitie

P.S. Ich habe mal versucht mich durch den Quellcode von Django zu wühlen und zu schauen, wie und wann Django die Übersetzungen raussucht. Leider war ich dabei nur mäßig erfolgreich. Allerdings wird beim Raussuchen immer auf den Request zurückgegriffen und der liefert als Sprache 'de'. Verstehe ich also genau wie vor 4 Jahren nicht ;-)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Dein Ansatz Django zu debuggen macht schon Sinn. Ich würd mal einen Debugger nutzen und in _ einen Breakpoint setzen und dann den Stack durchgehen um zu schauen was für ein locale gesetzt ist und wo die Übersetzung herkommt oder auch nicht.
Antworten