我有一个名为Topic
的模型的Django应用程序。我想在Django管理员中翻译这个模型的复数(参见下面屏幕截图中的红色椭圆)。
为了做到这一点,我做了以下事情:
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):我的目录结构可能有问题。这是:
答案 0 :(得分:4)
可能locale
目录不在您的应用目录中,或者未在LOCALE_PATHS
中定义。 https://docs.djangoproject.com/en/dev/topics/i18n/translation/#how-django-discovers-translations
应生成文件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可以解决你的问题。