我正在Django写一个简单的多语言网站,我在切换语言方面有点挣扎。我认为为每种语言设置不同的网址会很好(例如/ en / contact /用于英文网站,/ de / kontakt /用于德语网站)。也许这不仅看起来更好,而且在SEO背景下也有意义。
所以我在urls.py:
urlpatterns = pattern(‘’,
url(r’^de/kontakt/$’, mysite.views.DeKontaktView, name=‘kontakt’,),
url(r’^en/contact/$’, mysite.views.EnContactView, name=‘contact’,),
)
现在我希望在每个页面(在基本模板中)都有链接来切换德语和英语之间的语言。在Django文档中,我找到了'set_language重定向视图'(https://docs.djangoproject.com/en/1.6/topics/i18n/translation/#the-set-language-redirect-view)。
我的问题是在切换语言时,在哪里以及如何告诉视图应该重定向的位置。我并不总是希望重定向到我网站的首页,而是重定向到另一种语言的相应页面 - 它有一个完全不同的网址 - 不仅是网址中的不同语言前缀。
由于'set_language重定向视图'似乎使用引荐来源,除非帖子数据中有下一个参数,我的第一个想法是这样的:
views.py:
def EnContactView(request):
…
if request.LANGUAGE_CODE == ‘en’:
return render_to_response(‘en/contact.html’), context)
else:
return redirect(‘/de/kontakt/‘)
def DeKontaktView(request):
…
if request.LANGUAGE_CODE == ‘de’:
return render_to_response(‘de/kontakt.html’), context)
else:
return redirect(‘/en/contact/‘)
但我认为这可能不是一个好的解决方案,因为这也会根据浏览器语言重定向。例如:如果使用浏览器语言“en”的用户直接访问我们的德语网址,例如通过谷歌。由于会话中既没有cookie'en'也没有语言选择,访问者将被重定向到英文网址 - 这不是意图。
那么这些情况的最佳做法是什么?总结一下:我的语言网址完全不同 - 不仅仅是网址中的不同语言前缀。对于每种语言,我都有一个模板(目录模板/ en /和templates / de /)。
如果有人可以帮助我,那就太好了。对于django noob而言,“语言事物”非常混乱。
答案 0 :(得分:1)
https://docs.djangoproject.com/en/1.6/topics/i18n/translation/#translating-url-patterns
#setting.py
gettext = lambda s: s
LANGUAGES = (
('en', gettext('English')),
('de', gettext('De')),
)
#url
from django.http import Http404
from django.conf.urls.i18n import i18n_patterns
urlpatterns += i18n_patterns('',
url(r'^contact/$', mysite.views.ContactView, name='contact'),
)
#view
def ContactView(request)
if request.LANGUAGE_CODE == 'de':
return render_to_response('de/kontakt.html')
if request.LANGUAGE_CODE == 'en':
return render_to_response('en/contact.html')
raise Http404
答案 1 :(得分:0)
django.conf.urls.i18n.i18n_patterns
会处理语言切换部分(大部分)的语言前缀部分django.views.i18n.set_language
,您可以使用django.utils.translation.ugettext_lazy
翻译您的网址模式可翻译的“静态”文本。你仍然需要以这样或那样的方式处理内容的翻译(有很多或多或少的可插拔应用程序为Django模型解决这个问题),但这部分真的取决于你的应用程序的域和逻辑。
答案 2 :(得分:0)
对于那些在翻译方面遇到问题或正在创建多语言网站的人来说,这是一个更全面的解决方案。
在settings.py ...
中添加到MIDDLEWEAR_CLASSES,locale,它可根据请求选择语言:
'django.middleware.locale.LocaleMiddleware',
添加LOCALE_PATHS,这是您的翻译文件的存储位置,同时启用i18N: USE_I18N =真 LOCALE_PATHS =( os.path.join(PROJECT_PATH,' locale /'), )
将您要翻译网站的语言设置为:
ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('English')),
('fr', ugettext('French')),
('pl', ugettext('Polish')),
)
添加i18n模板上下文处理器,请求现在将包含LANGUAGES和LANGUAGE_CODE:
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n', # this one
'django.core.context_processors.request',
'django.core.context_processors.static',
'django.contrib.messages.context_processors.messages',
)
Nest,在urls.py中:
在url_patterns中,添加以下内容,它将启用设置语言重定向视图:
url(r'^i18n/', include('django.conf.urls.i18n')),
有关详情,请参阅Translations中的杂项。
添加以下导入,并使用i18n_patterns封装要翻译的网址。这就是我的样子:
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并用它包装每个字符串_(' text'),你甚至可以转到你的其他urls.py文件并做网址像这样翻译:
url(_(r'^dual_language/$'), landing, name='duallang_landing'),
您可以将要翻译的文本包装在其他文件中,例如models.py,views.py等。这是一个示例模型字段,其中包含label和help_text的翻译:
name = models.CharField(_('name'), max_length=255, unique=True, help_text=_("Name of the FAQ Topic"))
在你的html模板中......
现在,您可以进入模板并加载i18n模板标签,并对要翻译的静态内容使用trans和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
现在剩下的就是进入你的/ locales文件夹,并编辑每个.po文件。填写每个msgstr的数据。这是一个这样的例子:
msgid "English"
msgstr "Angielski"
将那些有意义的内容留空以获取默认语言。
最后编译消息:
./manage.py compilemessages
翻译需要学习更多内容,internationalization与此主题密切相关,因此请查看相关文档。我还建议查看一些可用于Django的国际化软件包,例如django-rosetta和django-linguo。它们有助于翻译模型内容,django-rosetta不会在数据库中为此创建新条目,而django-linguo会这样做。
如果你遵循这个,你应该有一个良好的开端。我相信这是让您的网站以多种语言运行的最标准化方式。干杯!