2016-04-28 12 views
2
settings.py: 
INSTALLED_APPS = [ 
    ..., 
    'modeltranslation', 
] 
TIME_ZONE = 'Europe/Belgrade' 
USE_I18N = True 
USE_L10N = True 
USE_TZ = True 
LANGUAGES = (
    ('en-us', _('English')), 
    ('hu', _('Hungarian')), 
    ('sr-latn', _('Serbian')), 
) 
LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'), 
    os.path.join(BASE_DIR, 'books', 'locale'), 
) 

urls.py: 
urlpatterns = [ 
    url(r'^i18n/', include('django.conf.urls.i18n')), 
    ] 
urlpatterns += i18n_patterns(
    url(_r('^books/'), include('books.urls', namespace='books')) 
    ) 

Meine Standardsprache ist Englisch. Mein Modell hat 3 Titelfelder für jede Sprache. Es ist, wie modeltranslation Paket funktioniert also:Django: Wie man Sprachen einstellt und ändert, die URLs richtig reflektieren?

(title_en, title_hu, title_sr_latn)

Da ich Slug Feld für die URL-Darstellung einer Instanz des Modells in der URL verwenden, ich habe 3 Slug fileds für jede Sprache entsprechend auch in meiner Modellklasse.

Ich sehe keinen Sinn, dass meine URL zum Beispiel so etwas wie dieses auf ungarisch aussehen sollte:

127.0.0.1/hu/konyvek/learn-django 

Ich möchte meine Urls wie folgt aussehen:

Englisch url (I wollen nicht die Sprache Präfix für die Standardsprache haben):

127.0.0.1/books/the-lord-of-the-rings 

ungarischen url:

127.0.0.1/hu/konyvek/a-gyuruk-ura 

serbischer url (es ist bedauerlich, dass serbische Sprache Präfix extreamly hässlich aussieht, aber das ist ein anderes Thema):

127.0.0.1/sr-latn/knjige/gospodar-prstenova 

ich nichts so weit, dass dieses Problem finden kann, löst . Es ist offensichtlich, dass ich auch nicht von diesen in meiner Sprache Schaltformularelement Wert in Vorlage ‚next‘ verwenden können: {{ request.path }} oder {{ request.get_absolute_path|slice:'3:' }}

Also habe ich die ‚next‘ Element vorübergehend ausgeschlossen. Wenn ich zwischen Sprachen umschalte, funktioniert auf meiner Titelseite alles gut. Wenn ich auf eine Buchseite gehe, zum Beispiel (/hu/konyvek/), zeigt es die Sprache richtig an, aber wenn ich von dort in eine andere Sprache wechseln möchte, kann ich das nicht tun. Es lädt nur die aktuelle Seite neu.

Irgendein Vorschlag, wie man das erreicht?

+0

Sie brauchen eine nächste URL in der neuen Sprache, das kann helfen: http://StackOverflow.com/Questions/11437454/Django-Templates-Get-Current-URL-in-Another-Sprache – pasztorpisti

+0

Vielen Dank @pasztorpisti für Sie Beitrag und Entschuldigung für die lange Verspätung zu beantworten. Aber das hat mir nicht geholfen. Und immer noch nach der Art von Lösung suchen. –

Antwort

1

Für jetzt konnte ich keine elegante Lösung dieses Problems finden. Ich habe jetzt eine hässliche Lösung, die nur temporär und nur bei diesem Projekt funktioniert, weil sie fest codiert ist.

fand ich diesen Code bei https://djangosnippets.org/snippets/2875/

@register.simple_tag(takes_context=True) 
def change_lang(context, lang=None, *args, **kwargs): 
    path = context['request'].path 
    url_parts = resolve(path) 

    cur_language = get_language() 

    try: 
     activate(lang) 
     url = reverse(url_parts.view_name, kwargs=url_parts.kwargs) 
    finally: 
     activate(cur_language) 


    return "%s" % url 

Aber diese Lösung nur die Hälfte meines Problems gelöst. Es wurde die Übersetzung des 'book /' Teils der URL korrekt übernommen, aber der Slug Teil e.i. Der Herr der Ringe blieb alt. Django konnte den URL-Pfad nicht auflösen, da die Sprache gewechselt wurde, die erste Ebene der URL wurde geändert, aber in urlconf gibt es so etwas wie e.i. "Konyvek/der Herr der Ringe /".

ich einen Code ein wenig geändert haben:

@register.simple_tag(takes_context=True) 
def change_lang(context, lang=None, *args, **kwargs): 

    path = context['request'].path 
    url_parts = resolve(path) 

    cur_language = get_language() 

    try: 
     translation.activate(lang) 
     if 'book' in context: 
      slug = context['book'].slug 
      url = reverse(url_parts.view_name, kwargs={'slug': slug}) 
     else: 
      url = reverse(url_parts.view_name, kwargs=url_parts.kwargs) 
    finally: 
     translation.activate(cur_language) 

    return '%s' % url 

„Zum Glück“, Kontextliste hat die Objektinstanz ‚Buch‘ genannt, so konnte ich es die entsprechende Slugfield wählen verwenden, nachdem ich die neue aktiviert Sprache hat es dann an Kwargs in umgekehrter Funktion weitergeleitet.

Vielleicht bessere Wahl wäre Middleware dann benutzerdefinierte Tag zu schreiben.

Wie auch immer, für jetzt funktioniert es, aber ich begrüße, wenn jemand hat oder findet viel bessere und allgemeine Lösung für diese.

Es scheint sehr seltsam, dass es für dieses Problem keine Out-of-the-Box-Lösung gibt.

Aber vielleicht irre ich mich und kann es einfach nicht finden.