如何在Django管理员中翻译模型的复数?

时间:2013-09-21 18:47:05

标签: python django django-models django-admin

我有一个名为Topic的模型的Django应用程序。我想在Django管理员中翻译这个模型的复数(参见下面屏幕截图中的红色椭圆)。

Screenshot

为了做到这一点,我做了以下事情:

1)在 models.py 中为模型添加 Meta 类:

from django.utils.translation import ugettext_lazy as _

class Topic(models.Model):
    title = models.CharField(max_length=140)

    def __unicode__(self):
        return self.title
    class Meta:
        verbose_name = _('topic')
        verbose_name_plural = _('topics')

2)Ran django-admin.py makemessages -l ru-RU,生成文件locale/ru/django.po

3)在django.po文件中添加了翻译:

msgid "topic"
msgstr "Тема"

msgid "topics"
msgstr "Темы"

4)跑django-admin.py compilemessages

5)更改了settings.py,以便在那里进行以下设置:

LANGUAGE_CODE = 'ru-RU'

ugettext = lambda s: s

LANGUAGES = (
  ('ru-RU', ugettext('Russian')),
)

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

USE_I18N = True

USE_L10N = True

但它仍然不起作用(管理员中标记的字母仍然以英文显示,而不是俄文)。

我可以做些什么来解决这个问题?

更新1(2013年9月28日13:26):我的目录结构可能有问题。这是:

Directory structure

3 个答案:

答案 0 :(得分:4)

  1. 可能locale目录不在您的应用目录中,或者未在LOCALE_PATHS中定义。 https://docs.djangoproject.com/en/dev/topics/i18n/translation/#how-django-discovers-translations

  2. 应生成文件locale/ru-RU/LC_MESSAGES/django.po

答案 1 :(得分:3)

我认为在应用程序文件夹中添加应用程序翻译是一种更好的做法,这使其易于查找。它也可以帮助您解决问题。

在您的应用中创建“区域设置”文件夹:

my-site/opinions/locale/

站在您的app文件夹中,运行“django-admin.py makemessages -l ru-RU”命令。它应该创建django.po文件,并将所需的翻译空白。

填写缺失的翻译后,运行“django-admin.py compilemessages”并重新启动服务器以防万一。

此外,在您的settings.py文件中,不要对文件夹使用硬编码字符串,动态获取它们是更好的做法

import os
PROJECT_ROOT = os.path.realpath(os.path.dirname(__file__))
LOCALE_PATHS = (os.path.join(PROJECT_ROOT, 'locale'), )

最后一段代码假定locale文件夹带有settings.py文件。

答案 2 :(得分:0)

我试过Django 1.7。

我尝试了相同的方法,但是第一次没有工作,在对Django进行一些调试后,我发现了一些提示并找到了解决方案,Django中应该有一些文件用于语言环境名称,实际上有一些规则没有记录。

在我的测试中,只能加载项目下的消息,app中的所有消息都无法翻译。

我在app的视图中尝试使用相同的index()方法打印_("")。只有在settings.py文件中的msgid才能被翻译。

代码如下所示:

def index(请求):

print request.LANGUAGE_CODE
str_msg = _("Welcome to poll list!")   ## this keep English output, only appears in app
print str_msg
str_msg = _("Simplified Chinese")     ## this one worked, it appears in settings.py
print str_msg
context = {'latest_question_list': latest_question_list,
           'message': str_msg}
....

检查了一些Django代码后,我发现它只允许在页面

下给出的语言环境名称

https://github.com/django/django/tree/master/django/conf/locale

请注意目录名称,没有' ru-RU',no' zh-cn'。

gettext.py中的代码:

def translation(domain, localedir=None, languages=None,
                class_=None, fallback=False, codeset=None):
    if class_ is None:
        class_ = GNUTranslations
    mofiles = find(domain, localedir, languages, all=1)
    if not mofiles:
        if fallback:
            return NullTranslations()
        raise IOError(ENOENT, 'No translation file found for domain', domain)

我通过更改' zh-cn'来修复我自己的问题。到' zh_CN',然后运行以下命令:

python manage.py makemessages -l zh_CN 

从文件夹' / zh-cn / LC_MESSAGES /'复制了django.po文件到文件夹' / zh_CN / LC_MESSAGES',以保留我的翻译。

python manage.py compilemessages

然后,

python manage.py runserver

现在一切都好!

所以,我认为要改变' ru-RU'到了' ru可以解决你的问题。