我想开发一个包含2种语言的站点,默认语言,我的母语和可选的英语。我计划让我的域名如此:
www.mydomain.com/tr/
www.mydomain.com/en/
默认情况下,一旦用户输入mydomain.com。它们将被重定向到/tr/
版本并选择通过顶级菜单转到/ en /。这是我的问题。
Django维护这两种语言的最佳方法是什么,请注意我不想自动翻译,但我想自己维护两种语言的文本。
由于
答案 0 :(得分:61)
所以这是你问题的长版本。在Django 1.4到1.7.1上测试:
在settings.py ...
中添加到MIDDLEWEAR_CLASSES
语言环境,它可以根据请求选择语言:
'django.middleware.locale.LocaleMiddleware',
添加LOCALE_PATHS
,这是您的翻译文件的存储位置:
LOCALE_PATHS = (
os.path.join(PROJECT_PATH, 'locale/'),
)
启用i18N
USE_I18N = True
将您要翻译网站的LANGUAGES
设置为:
ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('English')),
('pl', ugettext('Polish')),
)
添加i18n模板上下文处理器,请求现在将包含LANGUAGES
和LANGUAGE_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
]}
]
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包装你的文字!导入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"))
Django翻译文档很适合这个!
在你的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会这样做。
我还为有兴趣查看完整解决方案的人创建了django translation demo。
如果你遵循这个,你应该有一个良好的开端。我相信这是让您的网站以多种语言运行的最标准化方式。干杯!
答案 1 :(得分:28)
在我看来,你有两个主要选择:
(1)您可以将该网站的两个单独副本保存为不同的Django应用程序,只需将urlconf指向这些应用程序 - 因此{ur}中的url(r'^/en/', include(myproject.en))
将指向您的英语应用程序,另一种用于其他语言。这将涉及为两个应用程序维护不同的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 :(得分:3)
您可以使用自1.4版以来可用的可翻译网址格式。
https://docs.djangoproject.com/en/dev/topics/i18n/translation/#url-internationalization
答案 3 :(得分:2)
如果您需要在网址中指定网页的语言,则应该使用django-localeurl应用。即特别是你在你的例子中做了什么。 default Django translation machinery只是您网址的前缀,这可能对您的SEO策略无效。 django-localeurl
只修复了URL处理部分,同时与其他默认的Django翻译机器一起玩得很好。