【问题标题】:Django site with 2 languages具有 2 种语言的 Django 站点
【发布时间】:2012-05-04 02:01:41
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: django multilingual


    【解决方案1】:

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

    在 settings.py 中……

    添加到MIDDLEWARE_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 模板上下文处理器,请求现在将包括 LANGUAGESLANGUAGE_CODE

    对于 Django

    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(如上)并用它包装每个字符串,像这样_('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
    

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

    我还创建了一个django translation demo,供有兴趣查看完整工作解决方案的人使用。

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

    【讨论】:

    • 很好的答案!我只有一个简单的问题:如果它只返回字符串本身,为什么还要定义 ugettext?为什么不直接做 ('en', 'english')?
    • 所以它被当作你可以翻译的东西来挑选。
    • TEMPLATES 缺少右大括号。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢!另外,“Şimdi beim sitede Türk var!”让我开心:)
    • 实际上,最好阅读 radtek 的答案,它解释了在 Django 中执行此操作的正确方法。这可能看起来很长,但实际上从长远来看要好得多,因为添加了语言,例如使用 Rosetta 等。
    • 这是正确的。我的回答是 hack,不适合计划进行大量翻译的网站,无论是跨多个页面还是跨国家等
    • @Hellnar Google 表示不要使用 cookie 来提供不同的模板。他们说要使用 2 个不同的 url,因为爬虫使用可见文本来确定页面的语言,因此它可以将 2 个页面索引为搜索结果的不同语言。 support.google.com/webmasters/answer/182192?hl=en
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        • 1970-01-01
        • 2017-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多