it-swarm.com.de

django - wie mache ich eine Übersetzung?

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',
)
30
sa125

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).

2
sa125

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/",)
65
AbuFida

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!

21
radtek

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.

20
cethegeek

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

15
serg666_2000

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.

1
Evgeny

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.

1
Drachenfels

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.

0
Raham