web-dev-qa-db-fra.com

Django site en 2 langues

Je souhaite développer un site en 2 langues, une par défaut, ma langue maternelle et un anglais optionnel. J'ai l'intention d'avoir mes domaines en tant que tels:

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

Par défaut, une fois qu'un utilisateur entre sur mydomain.com. ils seront redirigés vers /tr/ version et sélectionnez pour accéder au/en/si vous le souhaitez via un menu supérieur. Et voici ma question.

Quelle est la meilleure façon Django de maintenir les deux langues, veuillez noter que je ne veux pas de traduction automatique mais je veux maintenir moi-même les textes pour les deux langues.

Merci

30
Hellnar

Selon moi, vous avez ici deux options principales:

(1) Vous pouvez conserver deux copies distinctes du site en tant qu'applications différentes Django et simplement avoir votre rlconf pointer vers ces applications - donc url(r'^/en/', include(myproject.en)) serait dans votre urlconf pour pointer vers votre application anglaise, et l'autre pour l'autre langue. Cela impliquerait de maintenir différents ensembles d'urlconfs et différents modèles html, etc. pour les deux applications, ce qui pourrait être utile si vous êtes intéressé par les URL elles-mêmes reflètent également les différentes langues (par exemple espagnol "/ pagina/uno" vs anglais "/ page/one").

(2) Vous enregistrez la préférence de langue dans un cookie (ce que vous devriez vraiment faire de toute façon) en utilisant sessions Django , puis demandez au modèle de fournir la version appropriée du texte comme vous le souhaitez à partir de ce cookie. Le code pour cela pourrait être:

# 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'

Et puis dans les modèles, pour rassembler ces informations, vous utiliseriez:

<!-- 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>
30
jdotjdot

Voici donc la version longue de votre question. Testé sur Django 1.4 à 1.7.1:

Dans settings.py…

Ajouter à MIDDLEWARE_CLASSES, locale, il permet la sélection de la langue en fonction de la demande:

'Django.middleware.locale.LocaleMiddleware',

Ajouter LOCALE_PATHS, c'est là que seront stockés vos fichiers de traduction:

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

Activer i18N

USE_I18N = True

Définissez LANGUAGES dans lequel vous allez traduire le site:

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

Ajoutez le processeur de contexte de modèle i18n, les demandes incluront désormais LANGUAGES et LANGUAGE_CODE:

Pour Django <1.8 mettez-le ici:

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

Pour Django> = 1.8 mettez-le ici:

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

Nest, dans urls.py:

Dans url_patterns, ajoutez ce qui suit, cela activera la vue de redirection de langue définie:

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

Voir Divers dans Traductions pour plus d'informations à ce sujet.

Ajoutez les importations suivantes et encapsulez les URL que vous souhaitez traduire avec i18n_patterns. Voici à quoi ressemble la mienne:

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

Remarque: Vous pouvez également déposer vos URL d'administration dans les i18n_patterns.

Enveloppez votre texte avec lazytext! importez lazytext (comme ci-dessus) et encapsulez chaque chaîne avec comme ça _ ('texte'), vous pouvez même aller dans vos autres fichiers urls.py et faire la traduction d'url comme ceci:

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

Vous pouvez encapsuler le texte que vous souhaitez traduire dans vos autres fichiers, comme models.py, views.py etc. Voici un exemple de champ de modèle avec des traductions pour label et help_text:

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

Les documents de traduction de Django sont parfaits pour cela!

Dans vos modèles html ...

Vous pouvez maintenant aller dans vos modèles et charger le templatetag i18n et utiliser trans et transblock sur les éléments statiques que vous souhaitez traduire. Voici un exemple:

{% 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 %}

Exécutez maintenant un makemessages pour chacun de vos paramètres régionaux:

./manage.py makemessages -l pl

Et maintenant, il ne reste plus qu'à aller dans votre dossier/locales et à modifier chacun des fichiers .po. Remplissez les données pour chaque msgstr. En voici un exemple:

msgid "English"
msgstr "Angielski"

Et enfin compilez les messages:

./manage.py compilemessages

Il y a beaucoup plus à apprendre avec les traductions et internationalisation est étroitement lié à ce sujet, alors consultez également la documentation. Je recommande également de vérifier certains des packages d'internationalisation disponibles pour Django comme Django-rosetta et Django-linguo . Ils aident à traduire le modèle contenu, Django-rosetta ne crée pas de nouvelles entrées pour cela dans votre base de données, contrairement à Django-linguo.

J'ai également créé une démo de traduction de Django pour ceux qui souhaitent regarder une solution de travail complète.

Si vous avez suivi cela, vous devriez prendre un bon départ. Je pense que c'est le moyen le plus standardisé de faire fonctionner votre site en plusieurs langues. À votre santé!

68
radtek

Vous pouvez utiliser des modèles d'URL traduisibles, disponibles depuis la version 1.4.

https://docs.djangoproject.com/en/dev/topics/i18n/translation/#url-internationalization

3
user1349830

Vous devriez opter pour l'application Django-localeurl si vous devez spécifier la langue d'une page dans l'URL . C'est à dire. spécifiquement ce que vous faites dans votre exemple. par défaut Django mécanisme de traduction préfixe simplement vos URL, ce qui peut être inefficace dans votre stratégie de référencement. Django-localeurl corrige simplement la partie de gestion des URL, tout en jouant à Nice avec le reste de la machine de traduction par défaut Django.

2