6

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

截屏

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

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(28.09.2013 13:26):我的目录结构可能有问题。这里是:

目录结构

4

3 回答 3

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

  2. 它应该生成一个文件locale/ru-RU/LC_MESSAGES/django.po

于 2013-09-24T17:17:07.447 回答
3

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

在您的应用程序中创建一个“语言环境”文件夹:

my-site/opinions/locale/

站在您的应用文件夹中,运行“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'), )

最后一段代码将假定语言环境文件夹包含 settings.py 文件。

于 2013-09-27T16:31:12.440 回答
0

我试过 Django 1.7。

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

而且在我的测试中,只能加载项目下的消息,应用程序中的所有消息都无法翻译。

我在我的应用程序视图中尝试使用相同的 index() 方法 print _("") 。只能翻译 settings.py 文件中的 msgid。

代码如下所示:

def 索引(请求):

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”,没有“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 

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

python manage.py compilemessages

然后,

python manage.py runserver

现在一切正常!

所以,我认为从 'ru-RU' 改为 'ru' 可能会解决你的问题。

于 2014-09-25T02:37:11.657 回答