2009-12-02 71 views
29

我正在尝试使用i18n以不同语言呈现模板。我做了我能读懂的所有内容,从设置语言代码,创建和编译翻译文件(包括模板中的翻译标记等),甚至通过{{LANGUAGE_CODE}}变量点,我的模板仍以英语呈现我打算渲染的正确(和不同)代码。我错过了什么?django - 如何使翻译工作?

模板:

{% extends "base.html" %} 
{% load i18n %} 
{% get_current_language as LANGUAGE_CODE %} 
{% get_available_languages as LANGUAGES %} 
{% get_current_language_bidi as LANGUAGE_BIDI %} 
{% block title %}{% trans "translation test" %}{% endblock %} 
{% block content %} 
<div id="some-text"> 
    {% trans "some translated text goes here" %} 
    {% blocktrans %} 
    <ol> 
    <li>here are some</li> 
    <li>items that should be</li> 
    <li>translated as well</li> 
    </ol> 
    {% endblocktrans %} 
    <ul> 
     <li>The current language is <b>{{ LANGUAGE_CODE }}</b></li> 
     {% if LANGUAGE_BIDI %} 
     <li>The current language is bidirectional</li> 
     {% else %} 
     <li>The current language is <b>not</b> bidirectional</li> 
     {% endif %} 
     <li>Available languages are: 
     <ul> 
     {% for lang in LANGUAGES %} 
      <li>{{ lang.1}}</li> 
     {% endfor %} 
     </ul> 
     </li> 
    </ul> 
</div> 
{% endblock %} 

观点:

$ django-admin.py makemessages -l he-il -e html 
$ django-admin.py compilemessages 

settings.py:

from django.shortcuts import render_to_response 
from django.template import RequestContext 
from pdb import set_trace as debugger 
def check(request): 
    return render_to_response('index.html', context_instance=RequestContext(request) 

命令行(我当时在.po文件正确的翻译填写)

# Language code for this installation. All choices can be found here: 
# http://www.i18nguy.com/unicode/language-identifiers.html 
LANGUAGE_CODE = 'he-il' 

gettext = lambda s: s 
LANGUAGES = (
    ('he-il', gettext('Hebrew')), 
    ('en-us', gettext('English')), 
) 

# If you set this to False, Django will make some optimizations so as not 
# to load the internationalization machinery. 
USE_I18N = True 

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.auth", 
    "django.core.context_processors.i18n", 
) 

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
) 

回答

2

我去它的方式是通过使用Django的在它自己的翻译文件使用确切的语言代码(而不是通过内部settings.py提供的链接),假设这种语言支持(如果不是事情变得复杂,因为你必须提供自己的翻译文件到Django的为好)。

我通过去$ DJANGO_DIR/conf/locale并查看文件夹的名称(对于我来说它位于/usr/local/lib/python2.6/dist-packages/django/conf/locale,但根据操作系统等可能有所不同)。

19

我可能是错的 - 为我所用的东西翻译是在一个测试项目很久以前唯一的一次 - 但我认为你不希望这样的:

$ django-admin.py makemessages -l he-il -e html

而恰恰这一点:

$ django-admin.py makemessages -l he_il -e html

注意下划线he_il

我在使用pt-BR时也遇到了问题,直到我用pt_br代替消息文件。然后事情开始工作......

是的,这是不明显的,我无法找到任何地方的文档。

希望有所帮助。

+2

刚才遇到了这个有趣的行为。 LANGUAGE设置应使用短划线,但/ locale /中的路径应使用下划线。 – Andrew 2011-04-02 22:48:09

+1

+1这就是它!这些互联网上有许多关于这个问题的问题,并且你已经完成了。我刚刚将我的语言从fr-fr更名为fr_fr,一切都变得生机勃勃! (在Django重启后)。 – mkoistinen 2013-04-06 01:45:33

+0

对我来说,我不得不使用:LANGUAGE_CODE ='en_GB',而在LANGUAGES =(('en-gb',ugettext('English')),...) – dalore 2013-10-31 12:34:04

1

是的,你确实需要进行信息文件作为celopes建议,然后将它们编译

python manage.py compilemessages 

但你仍然有问题。

禁用LocaleMiddleware了一点,即从您的中间件列表中删除此

django.middleware.locale.LocaleMiddleware 

。如果您不需要在运行时切换语言,则不要使用它,但如果您确实需要它,则会出现solution。之前我有the same problem,有人向我解释这一点。

另外我之前有过this weird issue。 Makemessages命令会阻塞.py文件中的反斜杠字符串。

+1

django翻译文档很好,但很长,不幸的是你需要阅读大部分的文档。 – Evgeny 2009-12-02 18:14:04

+0

我删除了中间件,但没有任何更改。即使LANGUAGE_CODE指向'he'(我将它从'he-il'更改为django.conf.locale所具有的内容),但页面仍然仅以英文呈现。有什么想法吗? – sa125 2009-12-03 14:30:31

+0

是否有关于消息构建和编译的错误消息?看看locale/he/django.po有没有#,模糊标记? – Evgeny 2009-12-03 18:37:44

1

我有非常相同的问题,我试图切换我的语言和django说不行。没有错误,没有警告,但Django的语言切换到pl-pl(在我的情况下)。但是从语言环境中删除所有文件夹并执行命令: django-admin.py makemessages -l pl_PL(下划线代替第二个PL的破折号和大写字母,解决了此问题)。

我希望它能帮助那里的一些人。

63

只需添加所产生的settings.py文件中像下面

LOCALE_PATHS = ("/xxx/xxx/Projects/xxx/sites/avb/locale/",) 
+8

经过多年你的答案仍然有帮助!谢谢! – Daviddd 2013-04-29 14:44:19

+3

要添加更多,我会推荐'os.path.join(BASE_DIR,'locale'),'。 **不要**使用相对路径,因为虽然他们在开发中工作,但他们可能无法工作取决于服务器等。 – Wtower 2015-12-15 10:29:40

13

我有同样的问题区域设置文件的路径。但是我通过将“Language:”放入.po文件来解决这个问题。在我的情况.po文件不包含“语言”属性,它看起来像......

 
"Language-Team: LANGUAGE \n" 
"Language: \n" 
"MIME-Version: 1.0\n" 

但是当我把语言代码(在我的情况下,“儒”或“恩”)

 
"Language-Team: LANGUAGE \n" 
"Language: ru\n" 
"MIME-Version: 1.0\n" 

它为我工作

4

我有同样的问题,似乎与您所在区域的路径必须结尾加上一个斜线

LOCALE_PATHS = (
    '/dir/to/my/locale/', 
) 
+2

谢谢。这是我的情况。这里有一个针对那些运行相同问题的代码片段:'LOCALE_PATHS = os.path.join(BASE_DIR,'','locale /')' – 2014-06-30 19:33:20

+0

我希望我可以不止一次地upvote – maersu 2014-09-25 05:13:40

+1

在我的情况下,逗号“,” – 2015-04-16 00:48:19

17

这是我一直在用从Django的1.4,仍然在1.7.1完整的解决方案:

在settings.py ...

添加到MIDDLEWEAR_CLASSES,语言环境,它能够根据要求语言选择:

'django.middleware.locale.LocaleMiddleware', 

添加LOCALE_PATHS,这是你的翻译文件将被存储:

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

启用国际化:

USE_I18N = True  

,你将网站被翻译成集语言:

ugettext = lambda s: s 
LANGUAGES = (
    ('en', ugettext('English')), 
    ('fr', ugettext('French')), 
    ('pl', ugettext('Polish')), 
) 

添加国际化模版上下文处理器TEMPLATE_CONTEXT_PROCESSORS,请求现在将包括语言和LANGUAGE_CODE:

'django.core.context_processors.i18n', 

在URL中的.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')), 
) 

现在任何地方,你使用的文字并希望将其进口lazytext转换和包装每一个字符串它像这样_(“文本”),你甚至可以去到其他网址.py文件,做像这样的网址翻译:

url(_(r'^dual_language/$'), landing, name='duallang_landing'), 

你可以用你想翻译的其他文件的文本,如models.py,views.py等。这里是翻译的例子示范田用于标签和help_text:

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

在您的HTML模板...

对您的模板做同样的事情,并加载国际化的模板标签,并在您要翻译的静态内容上使用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 

现在所有剩下的工作就是进入你的/区域设置文件夹,并编辑每个的.po的文件。填写每个msgstr的数据。这里是一个这样的例子:

msgid "English" 
msgstr "Angielski" 

最后编译消息:

./manage.py compilemessages 

对于模型实例数据转换,你可以使用一些现有的可重复使用的包装像

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

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

+0

谢谢你:)也要小心,你必须放在正确的地方LocalMidleware: '它应该在SessionMiddleware之后,因为LocaleMiddleware利用会话数据。它应该在CommonMiddleware之前出现,因为CommonMiddleware需要激活的语言才能解析所请求的URL。“更多你可以在这里找到[https://docs.djangoproject.com/en/1.8/topics/i18n/translation/#如何-Django的发现的语言偏好) – jkaluzka 2015-11-28 18:24:56

0

我有同样的问题。我在this link under another similar question中详细解释了它。

简单地说,我的问题已经解决了这个代码重新加载服务器:

sudo /etc/init.d/uwsgi reload 

现在,每次我改变短语和汇编语言文件后,我重新加载服务器太看到的变化。