我将如何根据语言从静态文件夹中实现不同的图像?例如,当访问主站点时,布局将以英语加载,但当更改为日语时,附加到布局的徽标和图像将根据请求的语言而变化。请帮忙.....
5 回答
您可以创建 iso 文件夹,例如:
/static/
/img/
/fr/
/en/
/us/
并创建一个模板标记,该标记根据语言环境设置返回语言 iso 前缀,例如:
{% static "img"|append_i18n_prefix %}
在您的模板中:
{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
然后是徽标等:
<img src="{{MEDIA_URL}}{{ LANGUAGE_CODE }}/logo.png" alt="" />
您可以将language
参数传递给页面模板并将其用作媒体文件 URL 的一部分。
这将要求您在一个文件夹中托管所有媒体文件(例如英语)SITE_MEDIA/english
,而其他(例如日语图像)可以从SITE_MEDIA/japanese
.
在您的页面模板中,您可以使用{{MEDIA_URL}}{{language}}/my-image.jpg
...
我推荐的方法是拥有您的基本模板(例如 page.html),然后针对差异进行扩展(即 page-fr.html)
在图像需要不同的地方,您有一个模板块,然后在 page-fr.html 中,您可以在该块中放入不同的图像。
这样,如果我们有图像,我们支持不同的语言,但如果我们没有翻译的图像,它仍然使用普通模板。您甚至可以为不同的语言提供不同的文本/布局(如果您愿意或需要,某些语言的文本非常长,可以改变标签的布局)。
然后在视图中,我们让它尝试加载 page-[locale].html(如果存在)(我们可以让它回退到 page-[lang].html 以获取类似 fr-ca 的内容),然后最终回退到 page.html如果存在。
模板页面.html:
{% blocktrans %}Some text{% endblocktrans %}
{% block image_one %}<img src='{% static "image_one.png" %}'>{% endblock %}
模板页面-fr.html:
{% extends 'page.html' %}
{% block image_one %}<img src='{% static "image_one-fr.png" %}'>{% endblock %}
那么在你看来:
context = {'data': data}
templates = ['page-fr.html', 'page.html']
return render(request, templates, context)
您可以将 page-fr.html 替换为一些查找当前语言并执行此操作的代码。你甚至可以制作一个简单的模板加载器来做到这一点(如果 django 应用程序没有,我不会感到惊讶)
这样做的好处是:
- 使用静态标签而不是 media_url 加入,因此您的所有静态中间件都可以正常工作(如散列文件名)
- 您可以覆盖任何内容,而不仅仅是图像
- 其他技术假设图像将始终存在于所有语言环境中,在这个技术中,它仅在您定义它时使用,并且您知道您拥有哪些图像。例如,如果您还没有 zh 图像,则可以将其保留为英文而不是 404(或者如果您有一些,您可以只做您想要的)。
我真的建议不要在这里使用其他答案,将字符串连接起来以生成最终内容。您正在为静态内容创建动态 url。如果您没有它,创建可能 404 的 url 的风险很大。此外,加入字符串不会让您访问静态中间件(因此没有长期缓存的散列 url)。您可以在加入后通过静态标签运行最终字符串,但如果该静态标签不存在,则会出现更糟糕的服务器错误。
Mikael 的回答略有不同,使用get_static_prefix
:
{% load i18n static %}
{% get_current_language as LANGUAGE_CODE %}
<img src="{% get_static_prefix %}path/to/image_{{ LANGUAGE_CODE }}.svg">