39

我想开发一个有 2 种语言的网站,一种是默认语言,一种是我的母语,另一种是可选的英语。我计划这样拥有我的域:

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

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

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

谢谢

4

4 回答 4

88

所以这是您问题的长版本。在 Django 1.4 到 1.7.1 上测试:

在 settings.py 中……</p>

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

'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 模板上下文处理器,请求现在将包括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')),

有关这方面的更多信息,请参阅翻译中的杂项。

添加以下导入,并用 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(如上)并用它包装每个字符串,就像这样_('text'),你甚至可以去你的其他urls.py文件并像这样进行url翻译:

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

翻译还有很多东西要学,国际化与这个主题密切相关,所以也请查看文档。我还建议查看一些可用于 Django 的国际化包,例如django-rosettadjango-linguo。它们帮助翻译模型内容,django-rosetta 不会在您的数据库中为此创建新条目,而 django-linguo 会。

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

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

于 2014-10-23T01:49:27.243 回答
43

正如我所看到的,您在这里有两个主要选择:

(1) 您可以将站点的两个单独副本保留为不同的 Django 应用程序,并且只需让您的urlconf指向这些应用程序——因此url(r'^/en/', include(myproject.en))在您的 urlconf 中将指向您的英语应用程序,而另一个指向其他语言。这将涉及为这两个应用程序维护不同的 urlconfs 集和不同的 html 模板等,如果您有兴趣让 URL 本身也反映不同的语言(例如西班牙语“/pagina/uno”与英语“ /页/一个”)。

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

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

<!-- 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>
于 2012-04-23T13:17:08.287 回答
3

您可以使用从 1.4 开始提供的可翻译 URL 模式。

https://docs.djangoproject.com/en/dev/topics/i18n/translation/#url-internationalization

于 2012-04-23T12:54:31.313 回答
2

如果您需要在 URL 中指定页面的语言,您应该使用django-localeurl应用程序。即特别是您在示例中所做的事情。默认的Django 翻译机制只是为您的 URL 添加前缀,这在您的 SEO 策略中可能无效。只是修复了 URL 处理部分,同时与默认的 Django 翻译机制的其余部分配合得很好。django-localeurl

于 2012-04-23T13:25:44.310 回答