6

我想用波斯语或印地语编码打印 {{forloop.counter}} 意味着有“1 2 3 4 ..”而不是“1 2 3 4 ...”。我搜索了很多,但找不到任何相关功能。你介意帮助我吗?

问候

4

7 回答 7

9

您可以创建自己的模板过滤器。

@register.filter(name='persian_int')
def persian_int(english_int):
    devanagari_nums = ('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹')
    number = str(english_int)
    return ''.join(devanagari_nums[int(digit)] for digit in number)

def hindi_int(english_int):
    devanagari_nums = ('०','१','२','३','४','५','६','७','८','९')
    number = str(english_int)
    return ''.join(devanagari_nums[int(digit)] for digit in number)
于 2016-04-25T19:48:03.147 回答
6

您可以使用自定义模板过滤器。我对 Django 的 l10n 库不够熟悉,不知道他们是否为您执行此操作。

def devanagari_int(arabic_int):
    """ Converts an arabic numeral (ex. 5817) to Devanagari (ex. ५८१७) """
    devanagari_nums = ('०','१','२','३','४','५','६','७','८','९')
    #    arabic_nums = ('۰','١','۲'....)
    #     farsi_nums = (...)
    number = str(arabic_int)
    return ''.join(devanagari_nums[int(digit)] for digit in number)

# register your filter, and then:
{{forloop.counter|devanagari_int}}

确保将过滤器文件保存为 UTF-8(或者使用适当的 unicode 表示)。

于 2012-08-24T06:27:56.403 回答
2

您可以制作一个模板过滤器,将数字转换为适当的编码。然后你可以这样使用它:

{{ forloop.counter|convert_to_hindi }}
于 2012-08-23T12:31:24.133 回答
1

您可以使用 django 国际化有一个库 l10n 在 django 中定义

于 2012-08-23T12:48:35.267 回答
1

您可以创建自己的自定义模板标签。

为此,您需要创建以下文件,假设您的应用名为“myapp”

myapp/
    __init__.py
    models.py
    templatetags/
        __init__.py
        extra_tags.py
    views.py

然后在文件中添加如下代码extra_tags.py

from django import template                                                             

register = template.Library()                                                           

@register.filter(name='persianize_digits')                                              
def persian_int(string):                                                                
    persianize = dict(zip("0123456789",'۰۱۲۳۴۵۶۷۸۹'))                                   
    return ''.join(persianize[digit] if digit in persianize else digit for digit in str(string))

现在您可以简单地{{ value|persianize_digits }}在您的模板中进行操作,数字将变为波斯语。此方法也适用于不是整体数字但在其中包含一些数字的字符串,例如10:27:33,它是一个持续时间。

于 2019-02-18T18:31:11.573 回答
0

这对我来说可以将英文数字转换为波斯数字

from django import template

register = template.Library()

@register.filter(name='persian_int')
def persian_int(english_int):
    persian_nums = {'0':'۰', '1':'۱', '2':'۲', '3':'۳', '4':'۴', '5':'۵', '6':'۶', '7':'۷', '8':'۸', '9':'۹'}
    number = str(english_int)
    persian_dict = number.maketrans(persian_nums)
    result = number.translate(persian_dict)
    return result
于 2020-11-22T12:35:28.990 回答
0

您可以尝试使用 unicode 版本的模板过滤器,如下所示:

register = template.Library()

to_arabic_number_trans = dict(
    zip((ord(s) for s in u'0123456789'),
        u'\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669')
)

to_english_number_trans = dict(
    zip((ord(s) for s in u'٠١٢٣٤٥٦٧٨٩'),
        u'\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089')
)

@register.filter
def format_number(value):
    cur_lang = get_language()
    if hasattr(value, 'translate'):
        if cur_lang == 'ar':
            return value.translate(to_arabic_number_trans)
        return value.translate(to_english_number_trans)
    return value


这适用于独立数字,但是关于日期数字的任何想法?就像在 2 يونيو، 2020 中一样,我怎样才能在不弄乱日期时间对象的情况下做到正确!

于 2020-06-03T09:52:07.423 回答