我刚刚开始使用Django国际化并试图了解使用的最佳实践{% blocktrans %}.是否最好{% blocktrans %}为每个段落使用一个,或者我应该有一个{% blocktrans %}包含许多段落的大?
拥有一个大{% blocktrans %}的更快,使我的模板看起来更干净,但我担心的是:
<p>...</p>)成为翻译字符串的一部分msgid就会改变,这似乎会影响其他段落.如果我有较小的块,那么更改将更加孤立(我想).msgid.我也想知道格式化.内线换线是否有任何复杂情况{% blocktrans %}?还是有领先的空间?例如:
{% blocktrans %}
You have {{ num_messages }} messages.
Another sentence.
{% blocktrans %}
Run Code Online (Sandbox Code Playgroud)
欢迎任何建议.
我有一个运行i18n的django 1.6网站.我可以使用模板顶部的选择框更改前端语言,但我不知道是否有django应用程序或技巧来更改管理语言,因为它似乎存储在会话变量的某个地方,并且它保持我在前端使用的第一种语言.
我正在尝试在我的Django应用程序中设置JavaScript代码的国际化.
我的Django应用程序有一个locale子目录,其中包含正确生成的djangojs.po文件.包的定义如下:
# urls.py
js_info_dict = {
'packages': ('my_project',),
}
Run Code Online (Sandbox Code Playgroud)
./manage.py makemessages由于该.po文件包含所有待翻译的字符串,但网站上没有任何JavaScript字符串被翻译,并且目录始终为空,因此效果很好.
我正在尝试翻译一些包含百分号的文本,如下所示:
{% trans "100% butterfly" %}
当我运行makemessages命令时,我在德语.po文件中得到以下输出:
#: .\appName\templates\appName\butterflies.html:54
#, fuzzy, python-format
#| msgid ""
#| "100% butterfly"
msgid ""
"100%% butterfly"
msgstr ""
"100% shmetterling"
Run Code Online (Sandbox Code Playgroud)
在编译时,无法将文本翻译为德语.我已经尝试过了{% trans "100%% butterfly" %},但是当用德语和英语查看时,这会导致页面显示"100 %% butterfly".我也尝试使用blocktrans标签来翻译文本,结果相同.
手动删除.po文件中的额外%,以及#, fuzzy, python-format行工作,但我宁愿不必为我正在尝试翻译的每个%符号执行此操作.
我如何在我的HTML中逃避这一点,以便Django停止在.po文件中生成模糊翻译,并且不会混淆思考我正在尝试做一些python格式化?
我想用django i18n支持翻译我的javascript文件.我有以下javascript文件:
var test_text = gettext('example');
@withStyles(styles)
export default class HomePage {
static contextTypes = {
i18n: PropTypes.object
}
constructor() {
this.componentDidMount.bind(this);
this.handleCitySearch.bind(this);
}
render() {
return (
<Grid className="HomePage">
<Row className="HomePage-hero">
<Col md={8} style={{ textAlign: 'center' }}>
<Input ref="city" bsSize="large" type="text" />
<Button bsSize="large" bsStyle="default" onClick={this.handleCitySearch}>{gettext('button text')}</Button>
</Col>
<Col md={4}>
<ul>
<li>{gettext('SOME TEXT')}</li>
<li>{gettext('MORE TEXT')}</li>
</ul>
</Col>
</Row>
</Grid>
);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我运行djangos makemessages命令:
python manage.py makemessages -l de -d djangojs -v 3 -s
Run Code Online (Sandbox Code Playgroud)
我希望创建的翻译文件有四个条目('example','button text','SOME TEXT'和'MORE TEXT'),因为gettext …
我已经为不同的城市翻译了该网站,并且在开发机器上运行良好。但是在生产服务器上发布时,它没有显示任何翻译。
但它正确显示了可用语言和当前语言。
这是我的settings.py:
USE_I18N = True
USE_L10N = True
LANGUAGES = [
('ru-spb', _('SaintP')),
('ru-msk', _('Moscow')),
]
LOCALE_PATHS = (
os.path.join(BASE_DIR, 'nordicsite/locale'),
)
Run Code Online (Sandbox Code Playgroud)
这是语言检查的模板:
{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_language_info_list for LANGUAGES as languages %}
{{server}}<br/>
{% trans 'Test 2' %}<br/>
{{LANGUAGE_CODE}}<br/>
{% for language in languages %}
{{ language.name_local }} ({{ language.code }})<br/>
{% endfor %}
<br/>
{% for path in paths %}
{{path}}<br/>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
开发人员的输出:
???? …Run Code Online (Sandbox Code Playgroud) 我需要包含两个按钮或链接,以允许用户更改英语和西班牙语之间的语言.我已经阅读了文档并尝试了这个:
<form action="/i18n/setlang/" method="post">{% csrf_token %}
<input name="language" type="hidden" value="es" />
<input type="submit" value="ES" />
</form>
Run Code Online (Sandbox Code Playgroud)
但是,每次单击该按钮时,页面都会重新加载,但语言根本不会更改.我错过了什么吗?
注意:我没有设置next,因为我只想用所需语言重新加载当前页面.
如果我使用docs提供的默认表单,结果是相同的:页面重新加载但语言没有改变:
<form action="{% url 'set_language' %}" method="post">
{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language">
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>
{{ language.name_local }} ({{ language.code }})
</option>
{% endfor %}
</select>
<input type="submit" value="Go" …Run Code Online (Sandbox Code Playgroud) 我在使用Django翻译格式化字符串时遇到问题django.utils.translations.只有没有格式(%s或{})的字符串才有效.
我的locale/en/LC_MESSAGES/django.po档案:
msgid "foo"
msgstr "bar"
#, python-format
msgid "foo %s"
msgstr "bar %s"
#, python-format
msgid "foo %(baz)s"
msgstr "bar %(baz)s "
#, python-brace-format
msgid "foo {}"
msgstr "bar {}"
#, python-brace-format
msgid "foo {baz}"
msgstr "bar {baz}"
Run Code Online (Sandbox Code Playgroud)
第一个字符串工作:
>>> from django.utils import translation
>>> translation.activate('en')
>>> translation.ugettext('foo')
'bar'
Run Code Online (Sandbox Code Playgroud)
但休息不是:
>>> translation.ugettext('foo %s' % 'bax')
'foo bax'
>>> translation.ugettext('foo %(baz)s' % {'baz': 'bax'})
'foo bax'
>>> translation.ugettext('foo {}'.format('bax'))
'foo bax'
>>> …Run Code Online (Sandbox Code Playgroud) 我在 django 网站中添加了“库尔德”语言。django 不支持这种语言,所以我添加了以下语言:\nin settings.py
\n\ngettext = lambda s: s\nNEW_LANG_INFO = {\n \'ku\': {\n \'bidi\': True,\n \'code\': \'ku\',\n \'name\': \'Kurdish\',\n \'name_local\': u\'\xda\xa9\xd9\x88\xd8\xb1\xd8\xaf\xdb\x8c\',\n },\n}\n\nimport django.conf.locale\nLANG_INFO = dict(**django.conf.locale.LANG_INFO, **NEW_LANG_INFO)\ndjango.conf.locale.LANG_INFO = LANG_INFO\n\nLANGUAGES = (\n (\'en\', \'English\'),\n (\'ku\', gettext(\'Kurdish\')),\n (\'ar\', \'Arabic\')\n)\nRun Code Online (Sandbox Code Playgroud)\n\n现在当我去的时候mysite.com/en/admin/它工作正常。当我去时mysite.com/ar/admin/它工作正常。\n但是当我去时mysite.com/ku/admin/它会引发错误并显示以下消息:\nValueError at /ku/admin/\n invalid token in plural form: EXPRESSION\n
Django 版本是1.11.6.
有什么问题以及如何解决它?
\n\n更新\n我发现在 django.po 中locale/ku/LC_MESSAGES,最后一行注释是"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\\n"
在 JavaScript“djangojs”的 Django i18n 中,有一个错误的假设,即只有语言是英语 - https://code.djangoproject.com/ticket/20280。
由于此限制,如果我的语言不是英语,我必须在字符串提取后将所有 msgid 复制到 msgstr。我在互联网上搜索但没有找到任何相关内容。
是否有任何工具可以在 *.po 文件上运行,将所有 msgid 复制到 msgstr?
我需要将波兰语翻译成波兰语,因为如果我不这样做,Django 就会将波兰语 JavaScript 翻译成英语——出了什么问题。欢迎您提出所有建议。
示例 - 波兰语 *.po:
msgid "Polski"
msgstr ""
Run Code Online (Sandbox Code Playgroud)
应该:
msgid "Polski"
msgstr "Polski"
Run Code Online (Sandbox Code Playgroud)
如果不这样做: Polski = 波兰语无效:
如果完成了 Polski = Polski!
这种需要是因为如果波兰语翻译为空,Django 首先加载英语而不是更新翻译,即使不需要,也不会翻译任何内容。除英语以外的所有语言都应该用这个技巧来完成。