2012-06-28 61 views
7

我试图为我的项目激活不同的语言。英语和西班牙语现在。Django i18n不起作用

我将介绍我按照所有的步骤:

首先,我把我自己我要翻译的目录。或者还好说,所有{%反%}标签:

$ cd media/templates/landing/ 
$ mkdir locale 
$ django-admin.py makemessages --locale=en 

最后命令创建目录/文件/locale/en/LC_MESSAGES/django.po

我打开django.po和我继续用英语完成所有的msgstr字段。 msgid标签是西班牙文。我尊重关于长信息案例的提示。填入此文件后,我制作:

$ django-admin.py compilemessages 

此过程django.po并创建django.mo。

所以我修改settings.py。重要的几行:

TEMPLATE_CONTEXT_PROCESSORS = (
    'ism.context_processor.user_vars', 
    'django.contrib.auth.context_processors.auth', 
    'django.core.context_processors.debug', 
    'django.core.context_processors.i18n', 
    'django.core.context_processors.media', 
    'django.core.context_processors.static', 
    'django.contrib.messages.context_processors.messages', 
    'django.core.context_processors.request', 
) 

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'pipeline.middleware.MinifyHTMLMiddleware', 
} 

TIME_ZONE = 'Atlantic/Canary' 

LANGUAGE_CODE = 'es' 

USE_I18N = True 

_ = lambda s: s 

LANGUAGES = (
    ('es', _('Espanol')), 
    ('en', _('English')), 
) 

USE_L10N = True 

USE_TZ = True 

最后,我此行添加到URLS.py:

(r'^i18n/', include('django.conf.urls.i18n')), 

我重新启动我的开发服务器,配置我的Firefox浏览器,选择英语作为第一主要语言,它不工作。所有的文字仍然以西班牙文而不是英文显示。

我确定Firefox配置为英文,因为在Django查看功能(呈现.html)时,我使用request.LANGUAGE_CODE打印了“en”。

我在做什么错了?

+0

你django-admin.py makemessages --locale = ES? – Efazati

+0

用户如何在en和es之间切换? – Efazati

+0

@Efazati我的项目的主要语言是ES,而不是EN。所以我明白我必须让'django-admin.py makemessages --locale = en',不是吗?这样,创建的django.po文件具有西班牙语的msgid字段,我必须用英语填写msgstr字段。 –

回答

3

首先,我把自己置于我想要翻译的目录中。或 还好说,所有的{%反%}标签:

$ CD介质/模板/着陆/ $的mkdir区域$ django-admin.py makemessages --locale = EN

这不是你应该怎么做翻译。

您创建要转换不是你想从,这是基本的语言翻译的一个语言信息文件。在这种情况下,这是英语。

此外comamnd需要从您的项目目录运行;不是模板目录。

所以,你命令应该是:

$ django-admin.py makemessages --locale=es

您应该从项目不是模板目录的根目录下运行。您也不会创建locale目录,该命令将为您创建该目录。

接下来,将您的翻译以西班牙文添加到文件中。该文件将具有英文标签。这告诉django加载英文版本的西班牙语版本。

一旦你的,你(从根再次)编译消息文件

$ django-admin.py compilemessages

现在翻译已经准备好为你的应用程序。你需要告诉Django你想要哪种语言。由于您正在使用内置视图来切换语言,因此您需要使用所需语言调用该视图。

还有就是你可以使用文档中提供的模板:

<form action="/i18n/setlang/" method="post"> 
{% csrf_token %} 
<input name="next" type="hidden" value="{{ redirect_to }}" /> 
<select name="language"> 
{% get_language_info_list for LANGUAGES as languages %} 
{% for language in languages %} 
<option value="{{ language.code }}">{{ language.name_local }} ({{ language.code }})</option> 
{% endfor %} 
</select> 
<input type="submit" value="Go" /> 
</form> 

让Django知道要加载的翻译从这个表格中选择语言。

您还应该阅读how django discovers language preference为您的意见和模板。

+1

我猜你是理解错误的。我在项目中的母语是ES(西班牙语),所以我想从ES翻译成英语(英语)。如果你访问这个链接(http://www.djangobook.com/en/1.0/chapter18/),你可以在他们的例子中看到他们告诉我们使用'django-admin.py make messages -l de' being DE他们想要翻译的语言。现在,我试图从我的项目的根目录进行所有的过程。从理论上讲,LocaleMiddleware必须自动检测用户浏览器中的语言,而无需事先选择。但事实并非如此。 –