【问题标题】:Hindi or Farsi numbers in django templating enginedjango 模板引擎中的印地语或波斯语数字
【发布时间】:2012-08-18 22:51:48
【问题描述】:

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

问候

【问题讨论】:

  • 您已经尝试过l10n 模板库了吗?
  • 1) 这是波斯语,而不是波斯语。 2) 在 Unicode 中,有两组 Eastern Arabic 数字,Arabic-Indic Digits (U+0660..U+-669) 和 Eastern Arabic-Indic Digits (U+06F0..U+06F9)。

标签: python django django-templates persian hindi


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这对我将英文数字转换为波斯数字很有用

    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
    

    【讨论】:

      【解决方案3】:

      您可以尝试如下模板过滤器的 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 年 我怎样才能在不弄乱日期时间对象的情况下正确处理它!

      【讨论】:

        【解决方案4】:

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

        为此,您需要创建以下文件,假设您的应用名为“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 这是一个持续时间。

        【讨论】:

          【解决方案5】:

          您可以使用custom template filter。我对 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 表示)。

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              您可以创建一个templatefilter,将数字转换为适当的编码。然后你可以这样使用它:

              {{ forloop.counter|convert_to_hindi }}
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-07-28
                • 1970-01-01
                • 2021-10-23
                • 1970-01-01
                • 1970-01-01
                • 2020-10-25
                • 2019-01-31
                • 1970-01-01
                相关资源
                最近更新 更多