2012-04-23 1 views
17

Ich möchte eine Website mit 2 Sprachen entwickeln, eine Standardsprache, meine Muttersprache und ein optionales Englisch. Ich plane, meine Domänen als solche zu haben:Django Seite mit 2 Sprachen

www.mydomain.com/tr/ 
www.mydomain.com/en/ 

Standardmäßig, sobald ein Benutzer mydomain.com eingeben. Sie werden zu /tr/ Version umgeleitet und wählen Sie aus, um zu dem/en/gehen, wenn sie über ein Top-Menü möchten. Und hier ist meine Frage.

Was ist der beste Django Weg, um beide Sprachen zu verwalten, bitte beachten Sie, dass ich keine automatische Übersetzung möchte, aber ich möchte Texte für beide Sprachen selbst pflegen.

Dank

Antwort

24

Wie ich es sehe, haben Sie zwei Möglichkeiten:

(1) Sie können zwei halten separate Kopien der Website als andere Django-Anwendungen und haben einfach Ihre urlconf Punkt auf jene Anwendungen - also url(r'^/en/', include(myproject.en)) wäre in deiner urlconf auf deine englische App und die andere auf die andere Sprache zu zeigen. Dies würde bedeuten, verschiedene Gruppen von URL-Konventionen und verschiedene HTML-Vorlagen usw. für die beiden Apps zu pflegen, was nützlich sein könnte, wenn Sie daran interessiert sind, dass die URLs auch die verschiedenen Sprachen widerspiegeln (zB Spanisch "/ pagina/uno" vs Englisch " /Seite eins").

(2) Sie notieren die Spracheinstellung in einem Cookie (was Sie wirklich tun sollten) unter Verwendung Django sessions, und dann die Vorlage liefern die entsprechende Version des Textes, wie Sie möchten, von diesem Cookie. Der Code dafür sein könnte:

# views.py 

# default to your native language 
request.session['lang'] = 'tr' 

# someone clicks the link to change to English 
def switch_to_English_link(request): 
    request.session['lang'] = 'en' 

Und dann in den Vorlagen, um diese Informationen zu sammeln, dann würden Sie verwenden:

<!-- my_django_template.html --> 
<div> 
    <span> 
    {% if request.session.lang == "en" %} 
     This is my text in English! 
    {% else %} 
     Şimdi benim sitede Türk var! 
    {% endif %} 
    </span> 
</div> 
+2

Danke !, auch "Şimdi benim sitede Türk var!" machte meinen Tag :) – Hellnar

+1

Eigentlich, lesen Sie besser radtek's Antwort, die den richtigen Weg erklärt, dies in Django zu tun. Das scheint lange her zu sein, aber auf lange Sicht ist es viel besser, weil es beispielsweise Sprachen hinzufügt, Rosetta usw. verwendet. –

+0

Das ist richtig. Meine Antwort ist ein Hack und nicht geeignet für eine Website, die viele Übersetzungen plant, sei es auf vielen Seiten oder länderübergreifend usw. – jdotjdot

2

Sie sollten für die django-localeurl App gehen, wenn Sie brauchen, um zu Geben Sie die Sprache einer Seite in der URL an. I.e. speziell, was Sie in Ihrem Beispiel tun. Die default Django translation machinery Präfixe nur Ihre URLs, die in Ihrer SEO-Strategie unwirksam sein können. django-localeurl behebt nur den URL-Behandlungsteil, während er gut mit dem Rest der Standard-Django-Übersetzungsmaschinerie spielt.

45

Also hier ist die lange Version zu Ihrer Frage. Getestet auf Django 1.4 bis 1.7.1:

In den Einstellungen.py ...

In den MIDDLEWEAR_CLASSES, locale, es Sprachauswahl basierend auf Anfrage ermöglicht:

LOCALE_PATHS = (
    os.path.join(PROJECT_PATH, 'locale/'), 
) 

i18N aktivieren

:

'django.middleware.locale.LocaleMiddleware', 

LOCALE_PATHS hinzufügen, dies ist, wo Ihre Übersetzungsdateien werden gespeichert

USE_I18N = True 

Set LANGUAGES das wird das Übersetzen Sie die Website:

ugettext = lambda s: s 
LANGUAGES = (
    ('en', ugettext('English')), 
    ('pl', ugettext('Polish')), 
) 

i18n Vorlage Kontext Prozessor hinzufügen, werden Anfragen sind jetzt LANGUAGES und LANGUAGE_CODE:

Für Django < 1.8 es hier setzen:

TEMPLATE_CONTEXT_PROCESSORS = (
    .... 
    'django.core.context_processors.i18n', # this one 
) 

Für Django > = 1.8 hier:

TEMPLATES = [ 
    { 
     'OPTIONS': { 'context_processors': [ 
     'django.template.context_processors.i18n', # this one 
    ]} 
] 

Nest, in urls.py:

In url_patterns, fügen Sie die folgenden, wird die eingestellte Sprache Redirect Ansicht aktivieren:

url(r'^i18n/', include('django.conf.urls.i18n')), 

See Diverses in Translations für mehr zu diesem Thema.

Fügen Sie die folgenden Importe hinzu und kapseln Sie die gewünschten URLs mit i18n_patterns ein. Hier ist, was meins aussieht:

from django.conf.urls.i18n import i18n_patterns 
from django.utils.translation import ugettext_lazy as _ 

urlpatterns = patterns('', 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^i18n/', include('django.conf.urls.i18n')), 
) 

urlpatterns += i18n_patterns('', 
    (_(r'^dual-lang/'), include('duallang.urls')), 
    (r'^', include('home.urls')), 
) 

Hinweis: Sie können auch Ihre Admin-URLs in die i18n_patterns fallen lassen.

Wickeln Sie Ihren Text mit Lazytext! Import lazytext (wie oben) und wickeln Sie jede Saite mit ihm wie so _ (‚text‘), können Sie auch auf Ihre anderen urls.py Dateien gehen und URL-Übersetzung tun wie so:

url(_(r'^dual_language/$'), landing, name='duallang_landing'), 

Sie können Text wickeln dass Sie in Ihren anderen Dateien, wie models.py übersetzt werden sollen, views.py etc .. Hier ist ein Beispiel Modellfeld mit Übersetzungen für Etiketten- und help_text:

name = models.CharField(_('name'), max_length=255, unique=True, help_text=_("Name of the FAQ Topic")) 

Django Übersetzung docs ist für diese!

in Ihren HTML-Vorlagen ...

Jetzt können Sie in Ihre Vorlagen gehen und die i18n TemplateTag laden und Sie trans- und Transblock auf dem statischen Material verwenden möchten, übersetzen. Hier ein Beispiel:

{% load i18n %} 

{% trans "This is a translation" %}<br><br> 
{% blocktrans with book_t='book title'|title author_t='an author'|title %} 
This is {{ book_t }} by {{ author_t }}. Block trans is powerful! 
{% endblocktrans %} 

nun ein makemessages für jede Ihrer locales laufen:

./manage.py makemessages -l pl 

Und jetzt alle übrig bleibt, ist in Ihren/Lokale Ordner zu gehen, und bearbeiten jede der .po Dateien.Füllen Sie die Daten für jede Nachricht aus. Hier ist ein solches Beispiel, dass:

msgid "English" 
msgstr "Angielski" 

Und kompiliert schließlich die Nachrichten:

./manage.py compilemessages 

Es gibt viel mehr ist mit Übersetzungen zu lernen und internationalization ist eng mit diesem Thema, so überprüft die docs dafür auch. Ich empfehle auch, einige der für Django verfügbaren Internationalisierungspakete wie django-rosetta und django-linguo auszuprobieren. Sie helfen bei der Übersetzung von Modellinhalten, django-rosetta erstellt dafür keine neuen Einträge in Ihrer Datenbank, während django-linglo dies tut.

Ich habe auch eine django translation demo für diejenigen erstellt, die eine voll funktionsfähige Lösung betrachten möchten.

Wenn Sie dies befolgt haben, sollten Sie einen guten Start haben. Ich glaube, dies ist der standardisierte Weg, um Ihre Website in mehreren Sprachen laufen zu lassen. Prost!

+0

Große Antwort! Ich habe nur eine kurze Frage: Warum definieren Sie Ugettext, wenn es nur die Zeichenfolge selbst zurückgibt? warum nicht einfach ('en', 'englisch')? – dietbacon

+0

So wird es als etwas aufgenommen, das Sie übersetzen können. – radtek

+0

Große Antwort, danke! –