sa1*_*125 30 django translation internationalization
我正在尝试使用i18n以不同语言呈现模板.我做了我能读到的所有内容,包括设置语言代码,创建和编译翻译文件,包括模板中的翻译标签以及所有这些,我的模板仍然用英语呈现,甚至通过{{LANGUAGE_CODE}}变量指向我打算渲染的正确(和不同)代码.我错过了什么?
模板:
{% 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 %}
Run Code Online (Sandbox Code Playgroud)
视图:
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)
Run Code Online (Sandbox Code Playgroud)
命令行(我确实在.po文件中填写了正确的翻译):
$ django-admin.py makemessages -l he-il -e html
$ django-admin.py compilemessages
Run Code Online (Sandbox Code Playgroud)
settings.py:
# 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',
)
Run Code Online (Sandbox Code Playgroud)
小智 65
只需将生成的语言环境文件的路径添加到settings.py文件中,如下所示
LOCALE_PATHS = ( "/xxx/xxx/Projects/xxx/sites/avb/locale/",)
Run Code Online (Sandbox Code Playgroud)
rad*_*tek 21
这是我从Django 1.4使用的完整解决方案,仍然在1.7.1中:
在settings.py中......
添加到MIDDLEWEAR_CLASSES,locale,它可以根据请求选择语言:
'django.middleware.locale.LocaleMiddleware',
Run Code Online (Sandbox Code Playgroud)
添加LOCALE_PATHS,这是您的翻译文件的存储位置:
LOCALE_PATHS = (
os.path.join(PROJECT_PATH, 'locale/'),
)
Run Code Online (Sandbox Code Playgroud)
启用I18N:
USE_I18N = True
Run Code Online (Sandbox Code Playgroud)
设置您将要将网站翻译为的语言:
ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('English')),
('fr', ugettext('French')),
('pl', ugettext('Polish')),
)
Run Code Online (Sandbox Code Playgroud)
将i18n模板上下文处理器添加到TEMPLATE_CONTEXT_PROCESSORS,请求现在将包括LANGUAGES和LANGUAGE_CODE:
'django.core.context_processors.i18n',
Run Code Online (Sandbox Code Playgroud)
在urls.py中:
在url_patterns中,添加以下内容,它将启用设置语言重定向视图:
url(r'^i18n/', include('django.conf.urls.i18n')),
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅翻译中的其他内容.
添加以下导入,并使用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')),
)
Run Code Online (Sandbox Code Playgroud)
现在你在任何地方使用文本并想要转换它,导入lazytext并用它包装每个字符串_('text'),你甚至可以转到你的其他urls.py文件并进行url翻译,如下所示:
url(_(r'^dual_language/$'), landing, name='duallang_landing'),
Run Code Online (Sandbox Code Playgroud)
您可以将要翻译的文本换行到其他文件中,例如models.py,views.py等.这是一个示例模型字段,其中包含label和help_text的翻译:
name = models.CharField(_('name'), max_length=255, unique=True, help_text=_("Name of the FAQ Topic"))
Run Code Online (Sandbox Code Playgroud)
在你的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 %}
Run Code Online (Sandbox Code Playgroud)
现在为每个语言环境运行makemessages:
./manage.py makemessages -l pl
Run Code Online (Sandbox Code Playgroud)
现在剩下的就是进入你的/ locales文件夹,并编辑每个.po文件.填写每个msgstr的数据.这是一个这样的例子:
msgid "English"
msgstr "Angielski"
Run Code Online (Sandbox Code Playgroud)
最后编译消息:
./manage.py compilemessages
Run Code Online (Sandbox Code Playgroud)
对于模型实例数据转换,您可以使用一些可用的可重用包
翻译需要学习更多内容,国际化与此主题密切相关,因此请查看相关文档.我还建议查看一些Django可用的国际化软件包,如django-rosetta和django-linguo.它们有助于翻译模型内容,django-rosetta不会在您的数据库中为此创建新条目,而django-linguo会这样做.
如果你遵循这个,你应该有一个良好的开端.我相信这是让您的网站以多种语言运行的最标准化方式.干杯!
cet*_*eek 20
我可能错了 - 因为我使用翻译的唯一一次是在许多月前的测试项目中 - 但我认为你不希望这样:
$ django-admin.py makemessages -l he-il -e html
而是这个:
$ django-admin.py makemessages -l he_il -e html
请注意下划线he_il.
我也遇到过pt-BR的问题,直到我用pt_br制作了消息文件.然后事情就开始了......
是的,它并不明显,我无法在任何地方找到相关文档.
希望有所帮助.
小智 15
我也有同样的问题.但我通过将"语言:"放到.po文件来解决它.在我的情况下.po文件不包含"Language:"属性,它看起来像......
"Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n"
但是当我输入语言代码时(在我的情况下'ru'或'en')
"Language-Team: LANGUAGE \n" "Language: ru\n" "MIME-Version: 1.0\n"
这个对我有用
我有同样的问题,似乎您的语言环境路径必须以斜杠结束:
LOCALE_PATHS = (
'/dir/to/my/locale/',
)
Run Code Online (Sandbox Code Playgroud)
我的方法是使用 django 在它自己的翻译文件中使用的确切语言代码(而不是通过 settings.py 中提供的链接),假设支持这种语言(如果不是事情变得复杂,因为你必须也向 django 提供您自己的翻译文件)。
我通过转到 $DJANGO_DIR/conf/locale 并查看文件夹的名称找到了这段代码(对我来说它位于 /usr/local/lib/python2.6/dist-packages/django/conf/locale ,但它可能有所不同取决于操作系统等)。
| 归档时间: |
|
| 查看次数: |
28927 次 |
| 最近记录: |