如何处理需要显示翻译版本的文本图像?

时间:2010-11-14 09:42:58

标签: django internationalization

处理i18n和文本图像的最佳方法是什么?

我有许多图片,其中包含文字,需要换成每种语言的正确版本。即我有一个带有英文文本的“header.gif”,然后是另一个带有法文文本的“header.gif”。

最简单的说法是什么

if my image exists in the current language:
    show the image
else
    show the english image

我正在考虑一个可以检查每个img标签的中间件,检查所请求的图像是否以当前语言提供,如果是,请更改img标签以显示它,如果没有,则不要。

我的另一个想法是简单地将图像引用括在{% trans ... %}标记中并更改.po文件中的网址

或其他方式?

3 个答案:

答案 0 :(得分:1)

您可以尝试通过为图像定义一些模型来解决这个问题:

class ImageTitle(models.Model):
    title = models.CharField('Title', max_length = 100) 

class Image(models.Model):
    title = models.ForeignKey(ImageTitle)
    image = models.ImageField('Image')
    language = models.CharField('Language', max_length = 100) 

定义一些根据语言设置渲染图像的功能。

答案 1 :(得分:1)

我创建了一个中间件,用于在渲染之前解析html,以检查媒体文件夹中locale文件夹中的图像。如果它们存在,则更改src标记,否则,保持原样:

def process_response(self, request, response):
    # check if we should try this here
    if self.inject_media(request, response):
        media_url = settings.MEDIA_URL
        lang = translation.get_language_from_request(request)
        media_root = settings.MEDIA_ROOT
        string = smart_unicode(response.content)
        no_case = string.lower()
        find = "%s[a-z0-9\.\_\/]+" % media_url
        pattern = re.compile(find)
        matches = pattern.findall(no_case)
        base_path = "%slocale/%s/" % (media_root, lang)
        for m in matches:
            p = m.replace(media_url, base_path)
            if os.path.isfile(p):
                url = m.replace(media_url, "%slocale/%s/" % (media_url, lang))           
                string = string.replace(m, url)

        response.content = string
    return response

答案 2 :(得分:1)

您还可以在媒体目录中创建子文件夹

/静态/ IMG / es_ES /静态/ IMG /的en_EN

使用{%media_url%}自定义模板标记,根据请求的语言发送正确的图像。