【问题标题】:Internationalizing images in django在 django 中国际化图像
【发布时间】:2012-06-06 10:48:47
【问题描述】:

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

【问题讨论】:

    标签: python django image internationalization


    【解决方案1】:

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

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

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

    {% static "img"|append_i18n_prefix %}
    

    【讨论】:

    • 你能给我一个示例代码吗?在语言环境和 css 中做了哪些更改?
    【解决方案2】:

    在您的模板中:

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

    然后是徽标等:

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

    【讨论】:

    • 简单说两句:1) “如果您想在模板中使用 {{ MEDIA_URL }},请在模板的 context_processors 选项中添加 django.template.context_processors.media。” 2)就我而言,我正在寻找{{ STATIC_URL }}
    【解决方案3】:

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

    这将要求您将所有媒体文件(例如英语)保存在文件夹 SITE_MEDIA/english 中,而其他(例如日语图像)可以从 SITE_MEDIA/japanese 获得。

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

    【讨论】:

    • 建议的解决方案可行,是的。您必须将 MEDIA_URL 和语言作为参数传递给您的页面模板上下文。但是,详细信息取决于您创建的实际实现...
    • 当然可以使用相同的技术来加载依赖于语言的.css文件...
    • 简单说两句:1) “如果您想在模板中使用 {{ MEDIA_URL }},请在模板的 context_processors 选项中添加 django.template.context_processors.media。” 2)就我而言,我正在寻找{{ STATIC_URL }}
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      使用get_static_prefix 与 Mikael 的回答略有不同:

      {% load i18n static %}
      {% get_current_language as LANGUAGE_CODE %}
      
      <img src="{% get_static_prefix %}path/to/image_{{ LANGUAGE_CODE }}.svg">
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-02
        • 2011-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多