有 2 种语言的 Django 网站

标签 django multilingual

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

www.mydomain.example/tr/
www.mydomain.example/en/

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

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

最佳答案

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

在 settings.py 中……

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

'django.middleware.locale.LocaleMiddleware',

添加 LOCALE_PATHS,这是您的翻译文件将存储的地方:

LOCALE_PATHS = (
    os.path.join(PROJECT_PATH, 'locale/'),
)

启用国际化

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 中,添加以下内容,它将启用设置语言重定向 View :

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 等。这是一个示例模型字段,其中包含标签和帮助文本的翻译:

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对于那些有兴趣查看完整工作解决方案的人。

如果您按照此操作,您应该有了一个良好的开端。我相信这是让您的网站以多种语言运行的最标准化的方式。干杯!

关于有 2 种语言的 Django 网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10280881/

相关文章:

Drupal 7 - 如何设置和翻译字段集合

c# - 国家不可知的学术水平代表

python - 无法登录用户在 Django 中使用 selenium 进行测试?

c# - MongoDB 中的多重排序规则

Django rest framework - 在 POST 后将新创建的对象的 id 传回响应

django - 在 Django REST 应用程序中使用 ETag 进行乐观锁定

php - 如何在 JavaScript 中使用值 (PHP)

python - 权限不足 : plone. app.multilingual [1.x] - 翻译原型(prototype)内容

django - 如何在 Django ORM 中更改 PostgreSQL 的默认空排序行为

python - 从 ReactJS 前端访问 Django MEDIA_URL 和 MEDIA_ROOT setting.py 值