Ich versuche mit i18n eine Vorlage in einer anderen Sprache zu rendern. Ich habe alles getan, worüber ich lesen konnte, angefangen beim Festlegen des Sprachcodes, dem Erstellen und Kompilieren von Übersetzungsdateien, einschließlich der Übersetzungs-Tags in der Vorlage und allem, und meine Vorlage wird immer noch in Englisch gerendert, selbst wenn die Variable {{LANGUAGE_CODE}} auf verweist Den richtigen (und anderen) Code, den ich rendern wollte. Was vermisse ich?
vorlage:
{% extends "base.html" %}
{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_current_language_bidi as LANGUAGE_BIDI %}
{% block title %}{% trans "translation test" %}{% endblock %}
{% block content %}
<div id="some-text">
{% trans "some translated text goes here" %}
{% blocktrans %}
<ol>
<li>here are some</li>
<li>items that should be</li>
<li>translated as well</li>
</ol>
{% endblocktrans %}
<ul>
<li>The current language is <b>{{ LANGUAGE_CODE }}</b></li>
{% if LANGUAGE_BIDI %}
<li>The current language is bidirectional</li>
{% else %}
<li>The current language is <b>not</b> bidirectional</li>
{% endif %}
<li>Available languages are:
<ul>
{% for lang in LANGUAGES %}
<li>{{ lang.1}}</li>
{% endfor %}
</ul>
</li>
</ul>
</div>
{% endblock %}
aussicht:
from Django.shortcuts import render_to_response
from Django.template import RequestContext
from pdb import set_trace as debugger
def check(request):
return render_to_response('index.html', context_instance=RequestContext(request)
befehlszeile (ich habe die korrekten Übersetzungen in .po-Dateien eingegeben):
$ Django-admin.py makemessages -l he-il -e html
$ Django-admin.py compilemessages
settings.py:
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'he-il'
gettext = lambda s: s
LANGUAGES = (
('he-il', gettext('Hebrew')),
('en-us', gettext('English')),
)
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
TEMPLATE_CONTEXT_PROCESSORS = (
"Django.core.context_processors.auth",
"Django.core.context_processors.i18n",
)
MIDDLEWARE_CLASSES = (
'Django.middleware.common.CommonMiddleware',
'Django.contrib.sessions.middleware.SessionMiddleware',
'Django.middleware.locale.LocaleMiddleware',
'Django.contrib.auth.middleware.AuthenticationMiddleware',
)
Ich habe den genauen Sprachcode verwendet, den Django in seinen eigenen Übersetzungsdateien verwendet (und nicht mit dem Link in settings.py), vorausgesetzt, diese Sprache wird unterstützt (wenn nicht, wird die Sache kompliziert, da dies erforderlich ist eigene Übersetzungsdateien für Django bereitstellen).
Ich habe diesen Code gefunden, indem ich zu $ Django_DIR/conf/locale gegangen bin und mir den Ordnernamen angesehen habe (für mich war es unter /usr/local/lib/python2.6/dist-packages/Django/conf/locale, aber es kann sich unterscheiden abhängig vom Betriebssystem und dergleichen).
Fügen Sie einfach die Pfade der generierten Gebietsschemadateien zur settings.py
-Datei wie folgt hinzu
LOCALE_PATHS = ( "/xxx/xxx/Projects/xxx/sites/avb/locale/",)
Dies ist eine vollständige Lösung, die ich von Django 1.4 und noch in 1.7.1 verwendet habe:
In settings.py…
Fügen Sie zu MIDDLEWEAR_CLASSES, locale, die Sprachauswahl basierend auf Anforderung hinzu:
'Django.middleware.locale.LocaleMiddleware',
Fügen Sie LOCALE_PATHS hinzu. Hier werden Ihre Übersetzungsdateien gespeichert:
LOCALE_PATHS = (
os.path.join(PROJECT_PATH, 'locale/'),
)
Aktivieren Sie I18N:
USE_I18N = True
Stellen Sie SPRACHEN, für die Sie die Site übersetzen möchten, auf Folgendes ein:
ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('English')),
('fr', ugettext('French')),
('pl', ugettext('Polish')),
)
Fügen Sie dem TEMPLATE_CONTEXT_PROCESSORS einen i18n-Vorlagenkontextprozessor hinzu. Zu den Anforderungen gehören jetzt SPRACHEN und LANGUAGE_CODE:
'Django.core.context_processors.i18n',
In urls.py:
Fügen Sie in url_patterns das Folgende hinzu, um die Ansicht zum Umleiten der Sprache zu aktivieren:
url(r'^i18n/', include('Django.conf.urls.i18n')),
Siehe Sonstiges in Übersetzungen für mehr dazu.
Fügen Sie die folgenden Importe hinzu und kapseln Sie die URLs, die mit i18n_patterns übersetzt werden sollen. So sieht meins aus:
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')),
)
Jetzt, wo Sie Text verwenden und konvertieren möchten, lazytext importieren und jeden String wie _ ("Text") damit einwickeln, können Sie sogar zu Ihren anderen urls.py-Dateien gehen und eine URL-Übersetzung wie folgt durchführen:
url(_(r'^dual_language/$'), landing, name='duallang_landing'),
Sie können den zu übersetzenden Text in Ihre anderen Dateien einbetten, z. B. models.py, views.py usw. Hier ein Beispiel für ein Modellfeld mit Übersetzungen für label und help_text:
name = models.CharField(_('name'), max_length=255, unique=True, help_text=_("Name of the FAQ Topic"))
In Ihren HTML-Vorlagen ...
Machen Sie dasselbe für Ihre Vorlagen und laden Sie den i18n-Templatetag und verwenden Sie trans und transblock für die statischen Elemente, die Sie übersetzen möchten. Hier ist 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 %}
Führen Sie jetzt für jede Ihrer Ländereinstellungen eine Makemeldung aus:
./manage.py makemessages -l pl
Jetzt müssen Sie nur noch in Ihren/locales-Ordner wechseln und jede .po-Datei bearbeiten. Füllen Sie die Daten für jede msgstr. Hier ist ein solches Beispiel:
msgid "English"
msgstr "Angielski"
Und schließlich kompilieren Sie die Nachrichten:
./manage.py compilemessages
Für die Modellinstanz-Datenübersetzung können Sie einige der verfügbaren wiederverwendbaren Pakete verwenden
Es gibt noch viel mehr zu lernen, mit Übersetzungen und Internationalisierung ist eng mit diesem Thema verbunden. Schauen Sie sich also auch die Dokumente an. Ich empfehle auch, einige der Internationalisierungspakete für Django wie Django-Rosetta und Django-Linguo zu prüfen. Sie helfen bei der Übersetzung von Modellinhalten. Django-rosetta erstellt keine neuen Einträge in Ihrer Datenbank, während Django-Linguo dies tut.
Wenn Sie dem gefolgt sind, sollten Sie einen guten Start haben. Ich glaube, dies ist der standardisierteste Weg, um Ihre Website in mehreren Sprachen zum Laufen zu bringen. Prost!
Ich kann mich irren - da ich vor vielen Monaten das einzige Mal mit Übersetzungsmaterial gearbeitet habe -, aber ich glaube, Sie wollen das nicht:
$ Django-admin.py makemessages -l he-il -e html
Sondern eher das:
$ Django-admin.py makemessages -l he_il -e html
Beachten Sie den Unterstrich in he_il
.
Ich hatte auch Probleme mit pt-BR, bis ich die Nachrichtendatei stattdessen mit pt_br erstellte. Dann fingen die Dinge an zu arbeiten ...
Ja, das ist nicht offensichtlich und ich konnte nirgendwo Unterlagen darüber finden.
Hoffentlich hilft das.
Ich habe das gleiche Problem. Aber ich löse es, indem Sie "Language:" in die .po-Datei setzen. In meinem Fall enthält die .po-Datei nicht das Attribut "Sprache:".
"Sprachteam: SPRACHE\n" "Sprache:\n" "MIME-Version: 1.0\n"
aber wenn ich Sprachcode setze (in meinem Fall 'ru' oder 'en')
"Sprachteam: SPRACHE\n" "Sprache: ru\n" "MIME-Version: 1.0\n"
für mich geht das
Ich hatte die gleichen Probleme, es scheint, als müsste Ihr Gebietsschemapfad mit einem Schrägstrich enden :
LOCALE_PATHS = (
'/dir/to/my/locale/',
)
Ja, Sie müssen Nachrichtendateien erstellen, wie von Celopes vorgeschlagen, und diese dann kompilieren
python manage.py compilemessages
Aber du wirst immer noch ein Problem haben.
Deaktivieren Sie LocaleMiddleware kurz, d. H. Entfernen Sie diese
Django.middleware.locale.LocaleMiddleware
aus Ihrer Middleware-Liste. Verwenden Sie es nicht, wenn Sie die Sprache zur Laufzeit nicht wechseln müssen, aber wenn Sie es brauchen, gibt es eine Lösung . Ich hatte dasselbe Problem vorher und jemand hat mir das erklärt.
Auch ich hatte dieses komische Thema vorher. Der Befehl Makemessages würde die mit Backslash umwickelten Zeichenfolgen in .py-Dateien verschlucken.
Ich hatte genau das gleiche Problem, ich versuchte meine Sprache zu wechseln und Django sagte nein. Kein Fehler, keine Warnung, aber Django hat die Sprache auf pl-pl umgestellt (in meinem Fall). Entfernen Sie jedoch alle Ordner aus dem Gebietsschema und führen Sie den folgenden Befehl aus: Django-admin.py makemessages -l pl_PL (Unterstrich anstelle von Bindestrich und Großbuchstaben für den zweiten PL, hat dieses Problem behoben).
Ich hoffe, es hilft einigen Jungs da draußen.
Ich hatte das gleiche Problem. Ich habe es mit Details in diesem Link unter einer ähnlichen Frage erklärt.
Kurz gesagt, mein Problem wurde gelöst, indem der Server mit diesem Code erneut geladen wurde:
Sudo /etc/init.d/uwsgi reload
Jedes Mal, wenn ich die Phrasen ändere und nach dem Kompilieren von Sprachdateien den Server neu lade, werden die Änderungen angezeigt.