django中的图像国际化

时间:2012-06-06 10:48:47

标签: python django image internationalization

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

5 个答案:

答案 0 :(得分:4)

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

这将要求您托管所有媒体文件,例如文件夹SITE_MEDIA/english中的英文,而其他文件,例如日文图片可以从SITE_MEDIA/japanese获得。

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

答案 1 :(得分:4)

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

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

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

{% static "img"|append_i18n_prefix %}

答案 2 :(得分:4)

在你的模板中:

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

然后是徽标等:

<img src="{{MEDIA_URL}}{{ LANGUAGE_CODE }}/logo.png" alt="" />

答案 3 :(得分:0)

我建议的方法是使用您的基本模板(例如,page.html),然后针对差异进行扩展(即page-fr.html)

需要不同图像的地方有一个模板块,然后在page-fr.html中可以在该块中放入另一个图像。

这样,如果我们有图片,我们就支持不同的语言,但是如果我们没有翻译的图片,它仍然使用普通模板。您甚至可以为不同的语言提供不同的文本/布局(如果需要,某些语言的文本非常长,可以更改标签的布局)。

然后在视图中尝试加载page- [locale] .html(如果存在,我们可以将其回退到page- [lang] .html,例如fr-ca),然后最终回退至page.html(如果存在)。

模板page.html:

{% blocktrans %}Some text{% endblocktrans %}
{% block image_one %}<img src='{% static "image_one.png" %}'>{% endblock %}

模板page-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,创建URL可能会有404的巨大风险。此外,连接字符串也不能使您访问静态中间件(因此不再需要长时间缓存的哈希URL)。加入后,您可以通过static标记运行最后一个字符串,但是如果该静态不存在,则会出现服务器错误,这更糟。

答案 4 :(得分: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">