2012-06-28 20 views
7

Sto provando ad attivare lingue diverse per il mio progetto. Inglese e spagnolo adesso.Django i18n non funziona

descriverò tutte le misure che seguo:

Prima di tutto, mi pongo nella directory voglio tradurre. O per meglio dire, in cui tutte le {% trans%} tag sono:

$ cd media/templates/landing/ 
$ mkdir locale 
$ django-admin.py makemessages --locale=en 

Ultimo comando crea la directory/file di /locale/en/LC_MESSAGES/django.po

apro django.po e procedo per completare tutti i campi msgstr in inglese. l'etichetta msgid è in spagnolo. Rispetto i suggerimenti sul caso di messaggi lunghi. Dopo riempimento in questo file, io faccio:

$ django-admin.py compilemessages 

Questo processo django.po e crea django.mo.

Quindi modifico settings.py. Linee Importante:

TEMPLATE_CONTEXT_PROCESSORS = (
    'ism.context_processor.user_vars', 
    'django.contrib.auth.context_processors.auth', 
    'django.core.context_processors.debug', 
    'django.core.context_processors.i18n', 
    'django.core.context_processors.media', 
    'django.core.context_processors.static', 
    'django.contrib.messages.context_processors.messages', 
    'django.core.context_processors.request', 
) 

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'pipeline.middleware.MinifyHTMLMiddleware', 
} 

TIME_ZONE = 'Atlantic/Canary' 

LANGUAGE_CODE = 'es' 

USE_I18N = True 

_ = lambda s: s 

LANGUAGES = (
    ('es', _('Espanol')), 
    ('en', _('English')), 
) 

USE_L10N = True 

USE_TZ = True 

Infine, aggiungo questa linea a URLS.py:

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

si riavvia il server di sviluppo, ho configurato il mio browser Firefox per scegliere l'inglese come prima lingua principale e non lo fa lavoro. Tutti i testi continuano a essere visualizzati in spagnolo e inglese.

Mi assicuro che Firefox sia configurato in inglese perché nella funzione di visualizzazione di Django (che esegue il rendering .html) faccio una stampa con request.LANGUAGE_CODE, che stampa "en".

Cosa sto sbagliando?

+0

ti è makemessages django-admin.py --locale = es? – Efazati

+0

in che modo l'utente passa da en a es? – Efazati

+0

@Efazati La lingua principale del mio progetto è ES, non EN. Quindi capisco che devo fare 'django-admin.py makemessages --locale = it', vero? In questo modo, il file django.po creato ha campi msgid in spagnolo e devo completare i campi msgstr in inglese. –

risposta

3

In primo luogo, mi metto nella directory che voglio tradurre. O per meglio dire , in cui tutte le {% trans%} tag sono:

$ cd media/templates/atterraggio/$ locale mkdir $ django-admin.py makemessages --locale = it

Questo non è come dovresti fare le traduzioni.

di creare file di messaggi per la lingua che si desidera tradurre - non quello che si desidera tradurre da, che è la lingua di base. In questo caso, questo è l'inglese.

Anche il comando deve essere eseguito dalla directory del progetto; non la directory del modello.

Così, comando dovrebbe essere:

$ django-admin.py makemessages --locale=es

è necessario eseguire dalla directory radice del vostro progetto non la directory dei modelli. Inoltre non si crea la directory locale, il comando la creerà per te.

Successivamente, si aggiungono le traduzioni in spagnolo al file. Il file avrà le etichette inglesi. Questo dice a Django di caricare l'equivalente spagnolo per la versione inglese.

Una volta che avete, si compila il file di messaggio (ancora una volta dalla radice)

$ django-admin.py compilemessages

Ora traduzioni sono pronti per l'applicazione. Devi dire a Django quale lingua vuoi. Dal momento che stai usando la visualizzazione integrata per cambiare lingua, devi chiamare quella vista con la lingua che desideri.

C'è un modello fornito nella documentazione che è possibile utilizzare:

<form action="/i18n/setlang/" method="post"> 
{% csrf_token %} 
<input name="next" type="hidden" value="{{ redirect_to }}" /> 
<select name="language"> 
{% get_language_info_list for LANGUAGES as languages %} 
{% for language in languages %} 
<option value="{{ language.code }}">{{ language.name_local }} ({{ language.code }})</option> 
{% endfor %} 
</select> 
<input type="submit" value="Go" /> 
</form> 

Selezionare la lingua da questo modulo in modo che Django conosce quali traduzioni caricare.

Si consiglia inoltre di leggere how django discovers language preference per visualizzazioni e modelli.

+1

Immagino tu stia capendo male. La mia lingua madre nel progetto è ES (spagnolo), quindi voglio tradurre da ES a EN (inglese). Se visiti questo link (http://www.djangobook.com/en/1.0/chapter18/) puoi vedere nel loro esempio come ci dicono di usare 'django-admin.py make messages -l de' being DE la lingua in cui vogliono tradurre. Ora, ho provato a fare tutto il processo dalla directory principale del mio progetto. In teoria, LocaleMiddleware deve eseguire la traduzione rilevando automaticamente la lingua dal browser dell'utente, senza alcuna selezione precedente. Ma non è così. –

3

Nota del redattore: questa risposta è stata trasferita da una modifica alla domanda. È stato scritto dal Poster originale.

Si è verificato un problema durante l'esecuzione del percorso della locale. Django stava ignorando (o semplicemente non trovava) la mia directory locale nel percorso root, quindi django.po/mo non era disponibile. Tutto questo roba può essere risolto aggiungendo LOCALE_PATHS in settings.py.

Maggiori informazioni ->https://docs.djangoproject.com/en/dev/topics/i18n/translation/#how-django-discovers-translations