Django网站有2种语言

Hel*_*nar 29 django multilingual

我想开发一个包含2种语言的站点,默认语言,我的母语和可选的英语.我计划让我的域名如下:

www.mydomain.com/tr/
www.mydomain.com/en/
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

rad*_*tek 70

所以这是你问题的长版本.在Django 1.4到1.7.1上测试过:

在settings.py中......

添加到MIDDLEWARE_CLASSES,locale,它可以根据请求选择语言:

'django.middleware.locale.LocaleMiddleware',
Run Code Online (Sandbox Code Playgroud)

添加LOCALE_PATHS,这是您的翻译文件的存储位置:

LOCALE_PATHS = (
    os.path.join(PROJECT_PATH, 'locale/'),
)
Run Code Online (Sandbox Code Playgroud)

启用i18N

USE_I18N = True
Run Code Online (Sandbox Code Playgroud)

设置LANGUAGES您将网站翻译为:

ugettext = lambda s: s
LANGUAGES = (
    ('en', ugettext('English')),
    ('pl', ugettext('Polish')),
)
Run Code Online (Sandbox Code Playgroud)

添加i18n模板上下文处理器,请求现在将包含LANGUAGESLANGUAGE_CODE:

对于Django <1.8,请将其放在此处:

TEMPLATE_CONTEXT_PROCESSORS = (
    ....
    'django.core.context_processors.i18n', # this one
)
Run Code Online (Sandbox Code Playgroud)

对于Django> = 1.8,请将其放在此处:

TEMPLATES = [
    {
        'OPTIONS': { 'context_processors': [
        'django.template.context_processors.i18n', # this one
    ]}
]
Run Code Online (Sandbox Code Playgroud)

在urls.py中嵌套:

在url_patterns中,添加以下内容,它将启用设置语言重定向视图:

url(r'^i18n/', include('django.conf.urls.i18n')),
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅翻译中的其他内容.

添加以下导入,并使用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')),
)
Run Code Online (Sandbox Code Playgroud)

注意:您也可以将管理员网址放入i18n_patterns.

用lazytext包装你的文字!import lazytext(如上所示)并用它包装每个字符串_('text'),你甚至可以转到你的其他urls.py文件并进行url翻译,如下所示:

url(_(r'^dual_language/$'), landing, name='duallang_landing'),
Run Code Online (Sandbox Code Playgroud)

您可以将要翻译的文本换行到其他文件中,例如models.py,views.py等.这是一个示例模型字段,其中包含label和help_text的翻译:

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

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 %}
Run Code Online (Sandbox Code Playgroud)

现在为每个语言环境运行makemessages:

./manage.py makemessages -l pl
Run Code Online (Sandbox Code Playgroud)

现在剩下的就是进入你的/ locales文件夹,并编辑每个.po文件.填写每个msgstr的数据.这是一个这样的例子:

msgid "English"
msgstr "Angielski"
Run Code Online (Sandbox Code Playgroud)

最后编译消息:

./manage.py compilemessages
Run Code Online (Sandbox Code Playgroud)

翻译需要学习更多内容,国际化与此主题密切相关,因此请查看相关文档.我还建议查看一些Django可用的国际化软件包,如django-rosettadjango-linguo.它们有助于翻译模型内容,django-rosetta不会在您的数据库中为此创建新条目,而django-linguo会这样做.

我还为那些有兴趣了解完整工作解决方案的人创建了一个django翻译演示.

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


jdo*_*dot 31

在我看来,你有两个主要选择:

(1)您可以将两个单独的站点副本保存为不同的Django应用程序,只需将您的urlconf指向这些应用程序 - 因此url(r'^/en/', include(myproject.en))您的urlconf将指向您的英语应用程序,另一个指向另一种语言.这将涉及为两个应用程序维护不同的urlconf集和不同的html模板等,如果您有兴趣让URL本身也反映不同的语言(例如西班牙语"/ pagina/uno"vs英语"),这可能很有用. /页/一").

(2)你使用Django会话在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'
Run Code Online (Sandbox Code Playgroud)

然后在模板中,为了收集这些信息,您将使用:

<!-- 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>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!,还有,"ŞimdibenimsitedeTürkvar!" 让我的一天:) (4认同)
  • 实际上,更好的阅读radtek的答案解释了在Django中这样做的正确方法.这可能看起来很长,但从长远来看实际上要好得多,因为例如添加语言,使用rosetta等等. (2认同)