我正在尝试翻译字符串。
{% load i18n %}
{% trans "Well, Hello there, how are you?" %}
为...
Hola amigo, ¿que tal?
我的settings.py文件包含:
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'translations'),
)
我得到了这个:
(env)glitch:translations nathann$ django-admin.py compilemessages
CommandError: Can't find msgfmt. Make sure you have GNU gettext tools 0.15 or newer installed.
我也不明白这个错误信息。
(env)glitch:ipals nathann$ django-admin.py makemessages -l es
CommandError:
This script should be run from the Django Git tree or your project or
app tree. If you did indeed run it from the Git checkout or your project
or application, maybe you are just missing the conf / locale(in the
django tree) or locale(for project and application) directory? It is not
created automatically, you have to create it by hand if you want to
enable i18n for your project or application.
文档:https://docs.djangoproject.com/en/1.6/ref/django-admin/#django-admin-makemessages
对于奖金upvotes,一个相关的问题: 我安装时没有链接gettext ...这个有什么帮助吗?我应该强迫它吗?
glitch:translations nathann$ brew link gettext
Warning: gettext is keg-only and must be linked with --force
Note that doing so can interfere with building software.
谢谢!
更新
我已经将翻译名称更改为区域设置并相应地更新了我的settings.py.然后我又跑了这个,它还在抱怨gettext:
(env)glitch:ipals nathann$ mv translations/ locale
(env)glitch:ipals nathann$ django-admin.py makemessages -l es
CommandError: Can't find xgettext. Make sure you have GNU gettext tools 0.15 or newer installed.
我也发现了这个:
Understand homebrew and keg-only dependencies
阅读之后:
(env)glitch:ipals nathann$ brew install gettext
Warning: gettext-0.18.3.2 already installed
(env)glitch:ipals nathann$ brew link gettext
Warning: gettext is keg-only and must be linked with --force
Note that doing so can interfere with building software.
答案 0 :(得分:68)
确定我在设置中有这个:
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale'),
)
print(LOCALE_PATHS)
我仔细检查了我的locale
目录在正确的位置,其名称拼写正确。
我最终链接了gettext(在superuser上询问之后):
brew link gettext --force
manage.py compilemessages
django-admin.py makemessages -l es
和BAM。我有我的po文件。
但医生说:
Warning: Some keg-only formula are linked into the Cellar.
Linking a keg-only formula, such as gettext, into the cellar with
`brew link <formula>` will cause other formulae to detect them during
the `./configure` step. This may cause problems when compiling those
other formulae.
Binaries provided by keg-only formulae may override system binaries
with other strange results.
You may wish to `brew unlink` these brews:
gettext
答案 1 :(得分:51)
请在Ubuntu中试用
sudo apt-get install gettext
在OSX中使用 brew install gettext
还要确保在settings.py文件中设置本地路径。
答案 2 :(得分:7)
这是针对翻译问题或者在Django中第一次创建多语言网站的解决方案。这是我这样做的方式,自从Django 1.4以来我一直在做,下面是在1.7.1中测试的:
在settings.py ...
中添加到MIDDLEWEAR_CLASSES,locale,它可根据请求选择语言:
'django.middleware.locale.LocaleMiddleware',
添加LOCALE_PATHS,这是您的翻译文件的存储位置,也可以启用i18N:
USE_I18N = True
LOCALE_PATHS = (
os.path.join(PROJECT_PATH, 'locale/'),
)
将您要翻译网站的语言设置为:
ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('English')),
('fr', ugettext('French')),
('pl', ugettext('Polish')),
)
添加i18n模板上下文处理器,请求现在将包含LANGUAGES和LANGUAGE_CODE:
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n', # this one
'django.core.context_processors.request',
'django.core.context_processors.static',
'django.contrib.messages.context_processors.messages',
)
Nest,在urls.py中:
在url_patterns中,添加以下内容,它将启用设置语言重定向视图:
url(r'^i18n/', include('django.conf.urls.i18n')),
有关详情,请参阅Translations中的杂项。
添加以下导入,并使用i18n_patterns封装要翻译的网址。这就是我的样子:
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并用它包装每个字符串_(&#39; text&#39;),你甚至可以转到你的其他urls.py文件并做网址像这样翻译:
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-rosetta和django-linguo。它们有助于翻译模型内容,django-rosetta不会在数据库中为此创建新条目,而django-linguo会这样做。
如果你遵循这个,你应该有一个良好的开端。我相信这是让您的网站以多种语言运行的最标准化方式。干杯!
答案 3 :(得分:6)
对于Mac用户来说,brew link gettext --force
可能存在风险,正如Brew建议的那样。更好的解决方法是为您的虚拟环境设置新的PATH variable
。因此,在位于虚拟环境文件夹的bin文件夹中的postactivate
文件中,键入:
export TEMP_PATH=$PATH
export PATH=$PATH:/usr/local/Cellar/gettext/0.19.7/bin
请注意,您必须使用计算机中安装的版本替换0.19.7
。
在predeactivate
文件中,该文件位于postactivate
文件的同一文件夹中,请输入:
export PATH=$TEMP_PATH
unset TEMP_PATH
现在您可以毫无后顾之忧地使用python manage.py makemessages -l <desired_language>
了。 :)
干杯。
答案 4 :(得分:2)
您是否已将{% load i18n %}
添加到模板顶部?
奖励:您不需要链接gettext,brew doctor
的输出是什么?
答案 5 :(得分:2)
请在您的ubuntu操作系统中安装gettext 使用sudo apt-get命令
或者在Mac
使用brew命令
答案 6 :(得分:1)
macOS
:
brew install gettext
export PATH="/usr/local/opt/gettext/bin:$PATH"
答案 7 :(得分:0)
如果您不想链接gettext
(您不应该因为操作系统X内部故障而导致这种情况不好),那么您可以为PATH
命令设置makemessages
。以下内容应该有效(但您需要调整gettext版本号):
PATH=/usr/local/Cellar/gettext/<installed version>/bin/:$PATH && \
django-admin makemessages -l <language>
如果你这样做,你安装的gettext
仍然只有keg-d和django-admin会很高兴找到它需要的所有程序。
答案 8 :(得分:0)
一种可能性是,在您成功完成以上所有操作之后,
pip install python-gettext
您可能未正确配置IDE或venv。为了绕过此操作,请转到命令提示符,导航到您的根文件夹并从此处运行py manage.py makemessages
。它将起作用。