2012-04-23 70 views
17

我想开发一种网站,使用2种语言,默认语言,我的母语和可选的英语。我打算让我的域名如下:Django网站有两种语言

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

默认情况下,一旦用户输入mydomain.com。他们将被重定向到/tr/版本,并选择通过顶层菜单转到/ en /。这是我的问题。

什么是最好的Django维护两种语言的方式,请注意,我不希望自动翻译,但我想自己维护两种语言的文本。

谢谢

回答

24

当我看到它,你这里有两个主要选项:

(1)你可以保持网站的两个单独的副本不同的Django的应用程序,只是有你urlconf点到这些应用 - 因此url(r'^/en/', include(myproject.en))将在您的urlconf中指向您的英文应用程序,另一个用于其他语言。这将涉及为这两个应用程序维护不同的urlconf集合和不同的html模板等,如果您有兴趣让URL本身也反映不同的语言(例如,西班牙语“/ pagina/uno”vs英语“ /页/一“)。 (2)您使用Django sessions在Cookie中记录语言首选项(您应该真的应该这样做),然后让该模板从该Cookie中提供适当的文本版本,然而您喜欢。该代码,这可能是:

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

然后在模板,来收集这些信息,你会使用:

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

谢谢!还有,“Şimdibenim sitedeTürkvar!”使我的一天:) – Hellnar 2012-04-23 21:20:41

+1

其实,更好地阅读radtek的答案,这解释了在Django中这样做的正确方法。这可能看起来很长,但实际上从长远来看要好得多,因为例如添加了语言,使用rosetta等等。 – 2015-05-30 10:44:35

+0

这是正确的。我的答案是黑客攻击,不适用于计划进行大量翻译的网站,无论是跨越多个页面还是跨越多个国家等。 – jdotjdot 2015-05-31 21:29:54

2

你应该去为django-localeurl应用程序,如果你需要到在URL中指定页面的语言。即特别是你在你的例子中做了什么。 default Django translation machinery只是您的网址的前缀,在您的SEO策略中可能无效。 django-localeurl只是修复了URL处理部分,与默认的Django翻译机器的其他部分相得益彰。

45

所以这里是你的问题的长版本。测试Django 1.4到1.7.1:

在设置中。PY ...

添加到MIDDLEWEAR_CLASSES,语言环境,它能够根据要求语言选择:

'django.middleware.locale.LocaleMiddleware', 

添加LOCALE_PATHS,这是你的翻译文件将被存储:

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

启用国际化

USE_I18N = True 

设置LANGUAGES你会被该网站翻译成:

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

添加国际化模板,背景处理器,请求将现在包括LANGUAGESLANGUAGE_CODE

Django的< 1.8把它放在这里:

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

Django的> = 1.8放在这里:

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

巢,在urls.py:

在url_patterns,添加以下时,将启用一套语言重定向视图:

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

见杂项在Translations更多关于这一点。

添加以下导入,并封装要与i18n_patterns一起转换的URL。这里是我的样子:

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

注意:您也可以将您的管理网址放入i18n_patterns。

用lazytext包装您的文本!进口lazytext(如上),敷每串用它像这样_(“文本”),你甚至可以去到其他urls.py文件和做像这样的网址翻译:

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

你可以用文本你想翻译的其他文件,如models.py,views.py等。下面是翻译标签和help_text一个例子示范田:

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

Django的翻译文档是为这个伟大的!

在你的HTML模板...

现在你可以进入你的模板和加载国际化templatetag和你要翻译的静态的东西使用反式transblock。这里有一个例子:

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

现在运行的每个区域设置的makemessages:

./manage.py makemessages -l pl 

现在所有剩下的工作就是进入你的/区域设置文件夹,并编辑每个的.po的文件。填写每个msgstr的数据。这里是一个这样的例子:

msgid "English" 
msgstr "Angielski" 

最后编译消息:

./manage.py compilemessages 

有很多更要学会与翻译和internationalization是密切相关的这个话题,所以检查出文档也是如此。我还建议查看一些Django可用的国际化软件包,如django-rosettadjango-linguo。他们帮助翻译模型内容,django-rosetta不会在数据库中为此创建新条目,而Django-linguo则可以。

我还为那些有兴趣查看完整工作解决方案的人创建了django translation demo

如果你遵循这一点,你应该开始一个好的开始。我相信这是使您的网站以多种语言运行的最标准化的方式。干杯!

+0

很好的答案!我只是有一个简单的问题:为什么定义ugettext,如果它只是返回字符串本身?为什么不只是做('en','english')? – dietbacon 2015-08-31 20:30:25

+0

所以它被拿起来作为你可以翻译的东西。 – radtek 2015-09-01 18:33:32

+0

很好的答案,谢谢! – 2016-08-03 14:59:14