Django translatable urls

27 views
Skip to first unread message

Murat Çorlu

unread,
Nov 9, 2012, 5:01:16 PM11/9/12
to python-...@googlegroups.com
Merhaba arkadaşlar,

Django'da bir sayfanın farklı dillerdeki url'lerini şu şekilde sunabilme çabasındayım:


Django 1.4 ile gelen çevrilebilir url desteğinden faydalanabileceğini ümid etmiştim ancak onu kullandığımda url path'lerinin başına aşağıdaki gibi dil kodlarını ekliyor:


Bu dil öneklerinden kurtularak, url'leri sunmayı nasıl başarabileceğim konusunda bir önerisi olan var mı? Bazı çakma yöntemler geliyor aklıma ancak, Django yapısından da çok çıkmak istemiyorum. Belki bu konuda tecrübeniz olmuştur.

Not: Bu şekilde url konfigürasyonu verebilme imkanını ilk kez PHP'nin Zend Framework'ünde elde etmiştim. Aynı yapıyı Django projelerime de uyarlamak istiyorum. Zend -> Django geçişi mevzusu geçtiği için bu anektodu de eklemek istedim.

Murat

Fatih ERİKLİ

unread,
Nov 9, 2012, 5:14:05 PM11/9/12
to python-...@googlegroups.com
Selam

Sanirim i18n_patterns ile tanimliyorsun url'leri. Ona gerek yok diye biliyorum.

Normal patterns ile tanimlayip deneyebilir misin? Yani sadece url kismini ugettext_lazy ile belirtip.

--
Fatih ERİKLİ

şahin mersin

unread,
Nov 9, 2012, 5:54:33 PM11/9/12
to python-...@googlegroups.com
Merhaba. benimde ilk aklıma gelen "localization". Benimde bir proje için başlamam gerekiyor aslında. Sorduğun iyi oldu. Bakalım ne gibi fikirler gelecek.


10 Kasım 2012 00:14 tarihinde Fatih ERİKLİ <fatih...@gmail.com> yazdı:



--
---------------------------------------------------------------------------------
Python Programlama Dili

Uğur Özyılmazel

unread,
Nov 10, 2012, 5:33:08 AM11/10/12
to python-...@googlegroups.com
url'deki /en/ /tr/ locale middleware'ine yardımcı olmak için geliyor… sesli düşünüyorum; ama ben olsam
urls.py'da r'(arama|search)/$' gibi giderdim. view içinde de eğer gelen "arama" ise "tr" değilse "en" gibi düşünürdüm ama şimdi yazarken bile hoşuma gitmedi. çünkü başa kelimeler / durumlar olunca bu iş zorlayacak...
sıkıntı hangi kelimelerde hangi dil'in aktif olması? ya kendin bir locale middleware'i yapıp olası kelimelerde lisanı burada tanımlayıp request.LANGUAGE_CODE'u set ediceksin ya da /en /tr gibi bir url'e razı olacaksın...

-- 
Uğur Özyılmazel
http://ugur.ozyilmazel.com | @ugurozyilmazel | @vigobronx | @vigodome
0533 377 43 00

Onur Çelebi

unread,
Nov 10, 2012, 5:54:57 PM11/10/12
to python-...@googlegroups.com

Bunu ben django 1.3.1'de kodlamistim. Bir middleware yaptim :

class NereoLocale(object):
    def process_view(self, request, view_func, view_args, view_kwargs):
        langCode = None
        
        if view_kwargs.has_key('lang'):
            langCode = view_kwargs['lang']
            translation.activate(langCode)
            request.LANGUAGE_CODE = translation.get_language()
            if hasattr(request, 'session'):
                request.session['django_language'] = langCode
            else:
                response.set_cookie('django_language', langCode)
        
        viewResponse = view_func(request, *view_args, **view_kwargs)
        
        return viewResponse


urls'dede her url ile bir request parameter yolluyorum :

...
(r'^super-urun-tanitimi/$', 'foo.views.product', {'lang':'tr'}),
(r'^my-super-product/$', 'foo.views.product', {'lang':'en'}),
(r'^le-produit-revolutionnaire/$', 'foo.views.product', {'lang':'fr'}),
...


Gerci ben yine url'in basinda /tr /en /fr formalizmiyle kullandim ama oyle olmadanda calisir bu kod.



2012/11/10 Uğur Özyılmazel <ugurozy...@gmail.com>

Murat Çorlu

unread,
Nov 11, 2012, 6:54:07 AM11/11/12
to python-...@googlegroups.com
Onur, bu yöntemde reverse url'i nasıl tanımlıyorsun? Yani template'de mevcut dildeki veya başka bir dildeki product sayfası url'ini nasıl ediniyordun?

Murat

Volkan Oransoy

unread,
Nov 11, 2012, 11:14:15 AM11/11/12
to python-...@googlegroups.com
https://docs.djangoproject.com/en/dev/topics/i18n/translation/#translating-url-patterns

Son projemde bu linkteki şekilde yaptım.
Url patternlerinin kendilerini tercüme edilebilir yapabiliyorsunuz. Dil ne olursa olsun named url ile erişebiliyorsunuz. 

Kolay gelsin.


11 Kasım 2012 13:54 tarihinde Murat Çorlu <murat...@gmail.com> yazdı:

Onur Çelebi

unread,
Nov 11, 2012, 11:23:11 AM11/11/12
to python-...@googlegroups.com
Haklısın unuttum onu göstermeyi. Bunun için custom template tag yarattım. Bunu göstermek için urls.py'deki yaptığımı daha detaylı göstermem lazım, önemli şeyleri kırmızı yaptım.
Her url tipine bir key eşleştirdim :

urls.py

i18nurls = {
    'leaveelanding' :
            {
               'fr':r'^fr/produit/logiciel-conges-absences-planning\.html$',
               'tr':r'^tr/urun/izin-takip-programi\.html$',
               'en':r'^en/product/online-leave-management-software\.html$',
               'func':'nereowebsite.products.views.productLeaveeView'
            },

    'leaveefeatures' :
            {
               'fr':r'^fr/produit/nereo-conges-fonctionnalites\.html$',
               'tr':r'^tr/urun/nereo-izin-ozellikler\.html$',
               'en':r'^en/product/nereo-leave-management-features\.html$',
               'func':'nereowebsite.products.views.productLeaveeFeaturesView'
            },
    'leaveedetails' :
            {
               'fr':r'^fr/produit/nereo-conges-absences-planning\.html$',
               'tr':r'^tr/urun/nereo-izin-avantajlar\.html$',
               'en':r'^en/product/nereo-leave-management-advantages\.html$',
               'func':'nereowebsite.products.views.productLeaveeDetailView'
            },
    ...
}
for urlKey in i18nurls:
    bItem = i18nurls[urlKey]
    urlpatterns += patterns('',
                            (bItem['fr'], bItem['func'], {'lang':'fr'}),
                            (bItem['tr'], bItem['func'], {'lang':'tr'}),
                            (bItem['en'], bItem['func'], {'lang':'en'}),
                            )



sonra custom template tag'i belirliyorsun:

urlengine.py

from django.template import Library
from django.utils.translation import to_locale, get_language

import urls

register = Library()


@register.simple_tag
def getUrl(urlId):
    langName = to_locale(get_language())[:2]
    
    if not urls.i18nurls.has_key(urlId):
        return "/"
    
    bItem = urls.i18nurls[urlId]
    
    if not bItem.has_key(langName):
        langName = 'fr'
    if not bItem.has_key(langName):
        return "/"
    
    retStr = "/"+bItem[langName][1:-1]
    
    retStr = retStr.replace('\.', '.')
    
    return retStr


sonra bunu template'lerinde kullanabiliyorsun :

mytemplate.html

{% load urlengine %}
...
            <tr>
                <td><div class="headMenuItem"><a href="{% getUrl "leaveelanding" %}">{% trans "Vue d'ensemble" %}</a></div></td>
                <td><div class="headMenuItem"><a href="{% getUrl "leaveefeatures" %}">{% trans "Fonctionnalités" %}</a></div></td>
                <td><div class="headMenuItem"><a href="{% getUrl "leaveedetails" %}">{% trans "Atouts" %}</a></div></td>
                <td><div class="headMenuItem"><a href="{% getUrl "leaveeprice" %}">{% trans "Tarifs" %}</a></div></td>
                <td><div class="headMenuItem"><a href="{% getUrl "leaveeclients" %}">{% trans "Clients" %}</a></div></td>
            </tr>
...






2012/11/11 Murat Çorlu <murat...@gmail.com>

Murat Çorlu

unread,
Nov 11, 2012, 7:04:25 PM11/11/12
to python-...@googlegroups.com
Ben de deniyorum ancak dil prefix'siz url kullanmayı henüz başaramadım.

Denemelerim sayesinde şöyle bir sonuca vardım:

Dil öneksiz url çevirisini şu şekilde belirtebiliyoruz:

from django.conf.urls import patterns, url
from django.utils.translation import ugettext_lazy as _

urlpatterns = patterns('',
    url(_(r'^user/(?P<username>[\w-]+)$'), 'core.views.user_profile', name='user_profile'),
)

Dil dosyalarında bu regex'i dile özgü ayarlarsak çalışıyor. Ancak, bu yöntem sadece "mevcut dilde" devam ettiğiniz sürece çalışıyor. Yani, örneğin yukarıdaki örnek için dil dosyalarında aşağıdaki tanımları yaptığımızı düşünelim:

^user/(?P<username>[\w-]+)$ -> en
^uye/(?P<username>[\w-]+)$ -> tr

Eğer, aktif django session'ımızın dili ingilizce ise 127.0.0.1:8000/user/muratcorlu diye sayfayı çalışırsam sayfa geliyor. Aynı şekilde, aktif dilim türkçe ise 127.0.0.1:8000/uye/muratcorlu dersem de sayfa türkçe olarak geliyor. Fakat ingilizcedeyken türkçe url'yi çağırırsam 404 veriyor. Yani bu url'leri dil belirlemek için kullanamıyoruz. Sitede gezinirken farklı dildeki bir sayfaya link vermek için, araya bir dil değiştirme redirect sayfası eklenerek bu sıkıntı giderilebilir gibi görünse de, bu linklere dışarıdan kullanıcı geldiğinde 404 alacağı için kullanışsız bir yöntem oluyor.

2011 Berlin konferansındaki konuyla ilgili bir sunumun 8-9. slaytlarında da bu tarz bir örnek verilmiş ancak ayrıntılı bir kullanım örneği yok. Hani bu sistemin harici gelen linklerde nasıl çalışacağı konusunda bir bilgi canlı sunumda verilmiş midir, bilemiyorum.

Bizim php ile yazdığımız ve şu an sahibinden.com'da da kullandığımız yöntemde, url parçaları dil dosyalarındaki değerlerle karşılaştırılıyor ve eşleştiği durumda, mevcut dil dosyası sayfanın dil değeri olarak set ediliyor. Bana da böyle bir sistem lazım ama sanırım bunu kendim yazmak zorunda kalacağım.



Murat
Reply all
Reply to author
Forward
0 new messages