我正在制作一个多语言的Django网站。我创建了一个消息文件,填充并编译它。我用我想要的语言(希伯来语)检查了网站(在这种情况下为管理员),并且大多数短语都像希伯来语一样出现,但有些则没有。我检查了源代码,这些内容仍然显示为_('Whatever')
,它们也会在消息文件中翻译,是的,我记得要compilemessages
。
翻译的哪些常见原因不是这样?
答案 0 :(得分:25)
也许已翻译的字符串标记为fuzzy
?
答案 1 :(得分:15)
刚受到一击。我在项目的根目录中有locale/
目录,但在INSTALLED_APPS
目录中默认为Django looks for translations,在默认翻译中。所以它没有找到我添加的翻译。但是我的一些字符串是Django附带的默认翻译(例如“搜索”),因此翻译了一些字符串,这让我很困惑。
要将我的翻译所在的目录添加到Django寻找翻译的地方列表中,我必须设置LOCALE_PATHS setting。所以在我的情况下,locale/
目录和settings.py
都在django项目的根目录中,我可以将以下内容放在settings.py
中:
from os import path
LOCALE_PATHS = (
path.join(path.abspath(path.dirname(__file__)), 'locale'),
)
答案 2 :(得分:8)
可能的原因是Lazy Translation。
例如,在views.py中,您应该使用 ugettext :
from django.utils.translation import ugettext as _
但是在models.py中,你应该使用 ugettext_lazy :
from django.utils.translation import ugettext_lazy as _
答案 3 :(得分:6)
您只需附上我过去必须做的一些修补程序:
在设置文件中
- 需要USE_I18N = True
django.middleware.locale.LocaleMiddleware(但只要Django根本不关心你的本地,这不是你的情况)
TEMPLATE_CONTEXT_PROCESSORS中的django.core.context_processors.i18n
我确实有其他与翻译有关的问题,但我不记得所有这些...希望这可以帮助你!
答案 4 :(得分:5)
我的项目现在遇到了这个问题。我在settings.py上设置了变量LANGUAGES:
LANGUAGES = (
('en', _('English')),
('pt-br', _('Brazilian Portuguese')),
)
带有locale文件夹的文件夹结构,以及一个子文件夹pt-br。事实证明我的翻译没有加载。 LANGUAGES变量遵循pt-br模式,文件夹必须位于pt_BR模式上。至少这是它在这里工作的唯一方式!
答案 5 :(得分:5)
我正在尝试提供完整的检查清单:
在settings.py
中,USE_I18N
,USE_L10N
,LANGUAGE_CODE
和LOCALE_PATHS
是否设置正确?
zh-hans
指定,而不是zh-cn
。在settings.py
中,django.middleware.locale.LocaleMiddleware
in correct order中是否包含MIDDLEWARE
?
您是否(重新)使用正确的本地名称from the correct place运行django-admin makemessages -l <locale-name>
?
ls your/path/to/python/site-packages/django/conf/locale/
,或通过taking a look at the source code _
而不是-
。例如,要指定简体中文,请执行django-admin makemessages -l zh_Hans
,而不是{{1} }或zh_CN
或zh_hans
或其他任何内容。您是否删除了PO文件中的所有zh-Hans
代码?
您是否已使用fuzzy
(重新)编译了OP文件?
您是否重新启动了网络服务器?
附加说明:
models.py
django-admin compilemessages
django.po
first_name = models.CharField(
pgettext_lazy('override default', 'first name'),
max_length=30
)
last_name = models.CharField(
pgettext_lazy('override default', 'last name'),
max_length=150
)
您将看到#: models.py:51
msgctxt "override default"
msgid "first name"
msgstr "姓"
#: models.py:55
msgctxt "override default"
msgid "last name"
msgstr "名"
,姓
而不是默认名
,姓氏
。
答案 6 :(得分:0)
另一个原因可能是错误的目录结构。
在运行 app 翻译的makemassages
命令之前,请仔细阅读manage命令的错误消息,该消息指示要创建的目录。 (对于某个应用,它必须是locale
,不是 conf/locale
。)请注意,即使目录结构错误,管理命令也能正常工作。
答案 7 :(得分:0)
我注意到,当我的文字中有%
时,翻译后的文字没有被使用。可能有其他字符可能导致此问题。我通过将%
转义为%%
来解决问题。
答案 8 :(得分:0)
我的回答在这里,除了我在 DateField
中使用的 2 个 ModelForm
之外,我的所有翻译都有效。
原来我的 forms.py
中有一个小部件不能很好地处理翻译。
我暂时删除了它,所以我可以享受圣诞节 =D