3

我将如何根据语言从静态文件夹中实现不同的图像?例如,当访问主站点时,布局将以英语加载,但当更改为日语时,附加到布局的徽标和图像将根据请求的语言而变化。请帮忙.....

4

5 回答 5

7

您可以创建 iso 文件夹,例如:

/static/
  /img/
    /fr/
    /en/
    /us/

并创建一个模板标记,该标记根据语言环境设置返回语言 iso 前缀,例如:

{% static "img"|append_i18n_prefix %}
于 2012-06-06T10:52:40.913 回答
6

在您的模板中:

{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}

然后是徽标等:

<img src="{{MEDIA_URL}}{{ LANGUAGE_CODE }}/logo.png" alt="" />
于 2012-06-06T10:55:20.227 回答
4

您可以将language参数传递给页面模板并将其用作媒体文件 URL 的一部分。

这将要求您在一个文件夹中托管所有媒体文件(例如英语)SITE_MEDIA/english,而其他(例如日语图像)可以从SITE_MEDIA/japanese.

在您的页面模板中,您可以使用{{MEDIA_URL}}{{language}}/my-image.jpg...

于 2012-06-06T10:50:50.430 回答
0

我推荐的方法是拥有您的基本模板(例如 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)。您可以在加入后通过静态标签运行最终字符串,但如果该静态标签不存在,则会出现更糟糕的服务器错误。

于 2018-09-28T10:11:52.713 回答
0

Mikael 的回答略有不同,使用get_static_prefix

{% load i18n static %}
{% get_current_language as LANGUAGE_CODE %}

<img src="{% get_static_prefix %}path/to/image_{{ LANGUAGE_CODE }}.svg">

于 2021-06-09T20:38:36.290 回答