【问题标题】:django-admin.py makemessages not workingdjango-admin.py makemessages 不工作
【发布时间】:2014-04-28 23:49:08
【问题描述】:

我正在尝试翻译一个字符串。

{% 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

对于奖金投票,一个相关的问题: 当我安装它时,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.

【问题讨论】:

    标签: python django homebrew gettext


    【解决方案1】:

    在确定我在设置中有这个之后:

    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
    

    【讨论】:

    • brew link gettext --force 是我所需要的,太棒了:)
    • "brew link gettext --force" 也帮助我!魔法!
    【解决方案2】:

    请在 Ubuntu 中试试这个

    sudo apt-get install gettext

    在 OSX 中使用brew install gettext

    还要确保在 settings.py 文件中设置本地路径。

    【讨论】:

    • 我运行 Debian9,有趣的是 gettext(这似乎是主要要求)已经安装在 0.19.8.1 版本中。但是msgfmt 不是。所以告诉 apt-get 按照建议安装 gettext,尽管 gettext 已经存在。它已安装并已修复。 耸耸肩
    【解决方案3】:

    这里是那些在翻译方面遇到问题或第一次在 Django 中创建多语言网站的人的解决方案。这是我这样做的方式,自 Django 1.4 以来我一直在这样做,下面在 1.7.1 中进行了测试:

    在 settings.py 中……

    添加到 MIDDLEWEAR_CLASSES,语言环境,它可以根据请求启用语言选择:

    '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',  
    )
    

    嵌套,在 urls.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')),
    )
    

    注意:您也可以将管理员网址放入 i18n_patterns。

    现在任何你使用文本并想要转换它的地方,导入lazytext并用它包装每个字符串,就像这样_('text'),你甚至可以去你的其他urls.py文件并像这样进行url翻译:

    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-rosettadjango-linguo。它们帮助翻译模型内容,django-rosetta 不会在您的数据库中为此创建新条目,而 django-linguo 会。

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

    【讨论】:

    • @FabrizioA 什么版本的 django?
    • Django 版本 1.9.12 ??
    【解决方案4】:

    对于 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 替换为您机器中安装的版本。

    在与postactivate 文件位于同一文件夹中的predeactivate 文件中,键入:

    export PATH=$TEMP_PATH
    unset TEMP_PATH
    

    现在您可以放心使用python manage.py makemessages -l &lt;desired_language&gt;。 :)

    干杯。

    【讨论】:

      【解决方案5】:

      对于macOS

      brew install gettext export PATH="/usr/local/opt/gettext/bin:$PATH"

      【讨论】:

      • brew install gettext brew link --force gettext
      【解决方案6】:

      您是否在模板顶部添加了{% load i18n %}

      奖励:您不需要链接 gettext,brew doctor 的输出是什么?

      【讨论】:

      • 是的,我有。我遇到了命令问题,而不是模板问题。
      • 似乎找不到您的语言环境文件。 BASE_DIR 设置是否正确且位于正确的文件夹中?
      • /Users/nathann/Code/ipals/ipals/translations 存在并且被正确引用。这是一个空目录。我以为我应该使用 makemessages 来填充它。 locale file 是什么意思?
      • 我认为我正在取得进步。我更改了事物的名称,现在找不到xgettext
      • gettext 的 /bin 文件夹中的程序是否在您的 PATH 中?如果您使用的是 venv,则 PATH 会有所不同
      【解决方案7】:

      请在您的 ubuntu 操作系统中安装 gettext 使用 sudo apt-get 命令

      或者在 Mac 中

      使用 brew 命令

      【讨论】:

        【解决方案8】:

        如果你不想链接gettext(你不应该这样做,因为搞乱 OS X 内部是不好的),那么你可以为makemessages 命令设置PATH。以下应该可以工作(但您需要调整您的 gettext 版本号):

        PATH=/usr/local/Cellar/gettext/<installed version>/bin/:$PATH && \
        django-admin makemessages -l <language>
        

        如果你这样做,你安装的 gettext 仍然是小桶,django-admin 会很高兴并找到它需要的所有程序。

        【讨论】:

          【解决方案9】:

          其中一种可能是在你成功完成以上所有操作并完成之后

          pip install python-gettext
          

          您可能错误地配置了您的 IDE 或 venv。为了绕过这个,转到命令提示符,导航到您的根文件夹并从那里运行py manage.py makemessages。它会起作用的。

          【讨论】:

            【解决方案10】:

            对我来说,在 Windows 10 上,问题是我使用了 pip install 安装的 gettext(我得到了 0.19 版)。我通过以下方式使其工作:

            1. 使用 pip 卸载 gettext。
            2. 从这里下载 gettext(作为 zip)而不是:https://mlocati.github.io/articles/gettext-iconv-windows.html
            3. 提取“C:/program files”文件夹中的文件
            4. 将“bin”文件夹(在提取的文件夹内)的路径添加到 Windows 环境变量中的 PATH 中。

            之后就成功了! (经过 5 小时的沮丧调试...)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-11-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-17
              • 1970-01-01
              • 2011-04-10
              • 2011-02-10
              相关资源
              最近更新 更多