django - comment faire fonctionner la traduction?
j'essaie de rendre un modèle dans une autre langue en utilisant i18n. J'ai fait tout ce que j'ai pu lire, depuis la définition du code de langue, la création et la compilation des fichiers de traduction, y compris les balises de traduction dans le modèle et tout ça, et mon modèle rend toujours en anglais, même à travers les points variables {LANGUAGE_CODE} vers le code correct (et différent) que j'avais l'intention de rendre. Ce qui me manque?
modèle:
{% 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 %}
:
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)
ligne de commande (j'ai rempli les bonnes traductions .les fichiers po):
$ 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',
)
9 réponses
il suffit d'ajouter les chemins des fichiers locaux générés dans le fichier settings.py
comme le suivant
LOCALE_PATHS = ( "/xxx/xxx/Projects/xxx/sites/avb/locale/",)
j'ai peut - être tort - car la seule fois où j'ai utilisé des traductions était sur un projet de test il y a de nombreuses lunes-mais je pense que vous ne voulez pas cela:
$ django-admin.py makemessages -l he-il -e html
mais plutôt ceci:
$ django-admin.py makemessages -l he_il -e html
remarquez le trait de soulignement dans he_il
.
j'avais des problèmes avec pt-BR aussi, jusqu'à ce que je fasse le fichier de messages avec pt_br à la place. Puis les choses ont commencé à travailler...
Oui, ce n'est pas évident et je n'ai pu trouver de documentation à ce sujet nulle part.
Espère que ça aide.
c'est une solution complète que J'ai utilisé de Django 1.4 et toujours en 1.7.1:
settings.py ...
ajouter à MIDDLEWEAR_CLASSES, locale, il permet la sélection de langue basée sur la demande:
'django.middleware.locale.LocaleMiddleware',
ajouter LOCALE_PATHS, c'est ici que vos fichiers de traduction seront stockés:
LOCALE_PATHS = (
os.path.join(PROJECT_PATH, 'locale/'),
)
Enable I18N:
USE_I18N = True
définissez les langues que vous traduit le site en:
ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('English')),
('fr', ugettext('French')),
('pl', ugettext('Polish')),
)
ajoute i18n template context processor à TEMPLATE_CONTEXT_PROCESSORS, les requêtes incluront désormais LANGUAGES and LANGUAGE_CODE:
'django.core.context_processors.i18n',
urls.py :
dans url_patterns, ajouter le ci-dessous, il permettra à la langue définie redirect view:
url(r'^i18n/', include('django.conf.urls.i18n')),
Voir Divers 1519320920" Traductions pour en savoir plus sur cette.
ajoutez les importations suivantes, et encapsulez les urls que vous voulez traduire avec i18n_patterns. Voici à quoi ressemble le mien:
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')),
)
maintenant, partout où vous utilisez du texte et que vous voulez le convertir, importer lazytext et envelopper chaque chaîne avec elle comme si _('texte'), vous pouvez même aller à votre autre urls.py fichiers et faire la traduction d'url comme cela:
url(_(r'^dual_language/$'), landing, name='duallang_landing'),
vous pouvez envelopper le texte que vous voulez traduit dans vos autres dossiers, tel comme models.py, views.py etc.. Voici un exemple de champ model avec des traductions pour label et help_text:
name = models.CharField(_('name'), max_length=255, unique=True, help_text=_("Name of the FAQ Topic"))
dans vos modèles html...
faites la même chose pour vos gabarits et chargez le i18n templatetag et utilisez trans et transblock sur les trucs statiques que vous voulez 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 emplacements:
./manage.py makemessages -l pl
et maintenant tout ce qui reste est d'aller dans votre dossier /locales, et d'éditer chacun des .les fichiers po. Remplissez les données pour chaque msgstr. En voici un exemple:
msgid "English"
msgstr "Angielski"
et enfin compiler les messages:
./manage.py compilemessages
pour la traduction de données d'instance de modèle vous pouvez utiliser certains des paquets réutilisables disponibles comme
Il ya beaucoup plus à apprendre avec des traductions et internationalisation est étroitement liée à ce sujet, alors consultez les docs pour elle aussi. Je recommande également de vérifier certains des paquets d'internationalisation disponibles pour Django comme django-rosetta , et django-linguo . Django-rosetta ne crée pas de nouvelles entrées pour cela dans votre base de données, contrairement à django-linguo.
Si vous avez suivi, vous devez être un bon début. Je crois que c'est le plus mode standardisé pour faire fonctionner votre site dans plusieurs langues. Acclamations!
j'ai le même problème. Mais je le résous en mettant "Language:" to .fichier po. Dans mon cas .le fichier po ne contient pas l'attribut" Language:", il ressemble...
"Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n"
mais quand je mets le code de langue (dans mon cas 'ru' ou 'en')
"Language-Team: LANGUAGE \n" "Language: ru\n" "MIME-Version: 1.0\n"
ça marche pour moi
j'ai eu les mêmes problèmes, il semble que vos paramètres régionaux chemin ont fin par une barre oblique :
LOCALE_PATHS = (
'/dir/to/my/locale/',
)
la façon dont je l'ai fait est en utilisant le code de langue exacte que django utilise dans ses propres fichiers de traduction (et non par le lien fourni à l'intérieur settings.py), en supposant que cette langue est prise en charge (si ce n'est pas compliqué, puisque vous devez fournir vos propres fichiers de traduction à django).
j'ai trouvé ce code en allant à $ DJANGO_DIR / conf / locale et en regardant le nom du dossier (pour moi, c'était à /usr/local/lib / python2.6 / dist-packages/django/conf / locale, mais elle peut différer selon L'OS et tel).
j'avais le même problème, j'ai essayé de passer ma langue et django dit pas d'aller. Pas d'erreur, pas d'avertissement, mais django commutation de langue à pl-pl (dans mon cas). Cependant, supprimer tous les dossiers de locale et exécuter la commande: django-admin.py makemessages-l pl_PL (souligné au lieu de tiret et lettre majuscule pour la deuxième PL, travaillé ce numéro).
j'espère que ça aidera certains gars là-bas.
Oui, vous avez besoin de faire des fichiers de messages que celopes suggère et puis les compiler
python manage.py compilemessages
Mais vous aurez toujours un problème.
désactiver LocaleMiddleware pour un bit, i.e. supprimer ce
django.middleware.locale.LocaleMiddleware
de votre liste middleware. Ne l'utilisez pas si vous n'avez pas besoin de changer la langue au moment de l'exécution, mais si vous en avez besoin, alors il y a une solution 1519100920". J'ai eu le même problème avant et quelqu'un m'a expliqué cela.
aussi j'ai eu ce problème bizarre avant. La commande Makemessages s'étouffe sur les cordes enveloppées de backslash .les dossiers py.
j'ai eu le même problème. Je l'ai expliqué en détail dans ce lien sous une autre question similaire .
brièvement, mon problème a été résolu en rechargeant le serveur avec ce code:
sudo /etc/init.d/uwsgi reload
maintenant, chaque fois que je change les phrases et après avoir compilé les fichiers de langue, je recharge le serveur aussi pour voir les changements.