简体   繁体   English

django 模板引擎中的印地语或波斯语数字

[英]Hindi or Farsi numbers in django templating engine

I want to print {{forloop.counter}} with persian or Hindi encoding means to have "۱ ۲ ۳ ۴ .." instead of "1 2 3 4 ...".我想用波斯语或印地语编码打印 {{forloop.counter}} 意味着有“۱ ۲ ۳ ۴ ..”而不是“1 2 3 4 ...”。 I searched a lot but I couldn't find any related functions.我搜索了很多,但找不到任何相关的功能。 Would you mind helping me?你介意帮我吗?

Regards问候

You can create your own template filter.您可以创建自己的模板过滤器。

@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)

You could use a custom template filter .您可以使用自定义模板过滤器 I'm not familiar enough with Django's l10n library to know if they do this for you.我对 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}}

Make sure you save your filter file as UTF-8 (or instead use the appropriate unicode representations).确保将过滤器文件保存为 UTF-8(或使用适当的 unicode 表示)。

You could make a templatefilter that converts a number to the appropriate encoding.您可以制作一个模板过滤器,将数字转换为适当的编码。 You could then use it as such:然后你可以这样使用它:

{{ forloop.counter|convert_to_hindi }}

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

You can create your own custom template tag.您可以创建自己的自定义模板标签。

To do so you need to create the following files assuming your app is called "myapp"为此,假设您的应用程序名为“myapp”,您需要创建以下文件

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

Then add the following code in the file extra_tags.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))

Now you can simply do {{ value|persianize_digits }} in your templates and the digits will become Persian.现在您只需在模板中执行{{ value|persianize_digits }} ,数字就会变成波斯语。 This method also works for strings that are not numbers as a whole but include some digits in them, eg 10:27:33 which is a time duration.此方法也适用于整体上不是数字但包含一些数字的字符串,例如10:27:33 ,这是一个持续时间。

You might try the unicode version of template filter as follows:您可以尝试使用 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


This works well for stand alone numbers, however any ideas about numbers in date?这适用于独立数字,但是关于日期数字的任何想法? like in 2 يونيو، 2020 how can i get it right without messing with datetime objects!就像在 2 يونيو، 2020 中一样,我怎样才能在不弄乱日期时间对象的情况下做到正确!

This worked for me to turn english numbers to persian numbers这对我将英语数字转换为波斯数字很有用

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM