2012-04-23 11 views
17

Desidero sviluppare un sito con 2 lingue, uno predefinito, la mia lingua madre e un inglese opzionale. Ho intenzione di avere i miei domini in quanto tale:Sito Django con 2 lingue

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

Per impostazione predefinita, una volta che un utente accede a mydomain.com. Verranno reindirizzati alla versione /tr/ e selezionare per andare a/en/se vogliono tramite un menu in alto. E qui è la mia domanda.

Qual è il miglior modo Django per mantenere entrambe le lingue, si noti che non voglio la traduzione automatica ma voglio mantenere i testi per entrambe le lingue.

Grazie

risposta

24

come la vedo io, si hanno due opzioni principali qui:

(1) È possibile mantenere due copie separate del sito come diverse applicazioni Django e semplicemente avere il vostro urlconf punto per queste applicazioni - quindi url(r'^/en/', include(myproject.en)) sarebbe nel tuo urlconf per indicare l'app inglese e l'altra per l'altra lingua. Ciò comporterebbe il mantenimento di diversi insiemi di urlconf e diversi modelli html, ecc. Per le due app, che potrebbe essere utile se sei interessato a far sì che gli URL stessi riflettano anche le diverse lingue (es. Spagnolo "/ pagina/uno" vs inglese " /pagina uno").

(2) È possibile registrare la preferenza di lingua in un cookie (che si dovrebbe comunque fare) utilizzando Django sessions e quindi fare in modo che il modello fornisca la versione appropriata del testo che si desidera da quel cookie. Il codice per questo potrebbe essere:

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

E poi nei modelli, per raccogliere queste informazioni, devi usare:

<!-- 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> 
+2

Grazie !, Inoltre, "Şimdi benim sitede Türk var!" ha reso la mia giornata :) – Hellnar

+1

In realtà, leggi meglio la risposta di radtek che spiega il modo corretto di farlo in Django. Quale potrebbe sembrare una lettura lunga, ma in realtà nel lungo periodo è molto meglio a causa dell'aggiunta di lingue, ad esempio, dell'uso di rosetta, eccetera. –

+0

Questo è corretto. La mia risposta è un hack e non adatto per un sito che ha in programma di fare un sacco di traduzione, sia su più pagine o in tutti i paesi, ecc – jdotjdot

2

Si dovrebbe andare per il django-localeurl applicazione se è necessario per specificare la lingua di una pagina nell'URL. Cioè nello specifico quello che stai facendo nel tuo esempio. Lo default Django translation machinery prefigura solo i tuoi URL che possono essere inefficaci nella tua strategia SEO. django-localeurl risolve solo la parte relativa alla gestione degli URL, pur giocando con il resto del meccanismo di traduzione Django predefinito.

45

Quindi ecco la versione lunga alla tua domanda. Testato su Django 1.4 thru 1.7.1:

Nelle impostazioni.pi ...

Aggiungi al MIDDLEWEAR_CLASSES, locale, permette la selezione della lingua in base alla richiesta:

'django.middleware.locale.LocaleMiddleware', 

Aggiungi LOCALE_PATHS, questo è dove verranno memorizzati i file di traduzione:

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

Abilita i18N

USE_I18N = True 

Impostare LANGUAGES che sarete traducendo il sito per:

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

Aggiungere i18n processore contesto template, le richieste verranno ora includono LANGUAGES e LANGUAGE_CODE:

per Django < 1.8 metterlo qui:

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

per Django > = 1.8 metterlo qui:

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

Nest, in urls.py:

In url_patterns, aggiungere il seguito, permetterà la visualizzazione di reindirizzamento lingua impostata:

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

vedere Varie a Translations per maggiori informazioni su questo.

Aggiungere le importazioni seguenti e incapsulare gli URL che si desidera tradurre con i18n_patterns. Ecco cosa miniera assomiglia:

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

Nota: Si può anche cadere gli URL di amministrazione nelle i18n_patterns.

Avvolgi il tuo testo con lazytext! importazione lazytext (come sopra) e avvolgere ogni stringa con essa in questo modo _ ('testo'), si può anche andare in altri file urls.py e fare traduzione url in questo modo:

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

È possibile disporre il testo che si desidera tradotto nella tua altri file, ad esempio models.py, views.py ecc .. Ecco un campo modello esempio con traduzioni per etichetta e help_text:

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

Django documenti di traduzione sono grandi per questo!

nei template HTML ...

Ora si può andare in vostri modelli e caricare la templatetag i18n e utilizzare Transblock trans e sulle cose statica che si desidera tradurre. Ecco un esempio:

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

Ora eseguire un makemessages per ognuno dei vostri locali:

./manage.py makemessages -l pl 

E ora tutto è rimasto è quello di andare nella cartella/locali, e modificare ciascuno dei .po File.Compila i dati per ogni msgstr. Ecco un esempio di che:

msgid "English" 
msgstr "Angielski" 

E infine compilare i messaggi:

./manage.py compilemessages 

C'è molto di più da imparare con traduzioni e internationalization è strettamente legato a questo argomento, in modo da controllare la documenti anche per questo. Consiglio anche il check-out alcuni dei pacchetti di internazionalizzazione disponibili per Django come django-rosetta e django-linguo. Aiutano a tradurre il contenuto del modello, django-rosetta non crea nuove voci per questo nel tuo database, mentre fa django-linguo.

Ho anche creato un django translation demo per chi è interessato a guardare una soluzione di lavoro completo.

Se avete seguito questo si dovrebbe essere fuori ad un buon inizio. Credo che questo sia il modo più standard per far funzionare il tuo sito in più lingue. Saluti!

+0

Ottima risposta! Ho solo una breve domanda: perché definire ugettext se restituisce semplicemente la stringa stessa? perché non farlo ('en', 'inglese')? – dietbacon

+0

Quindi viene rilevato come qualcosa che puoi tradurre. – radtek

+0

Ottima risposta, grazie! –