[Answered ]-Django: Slug in Vietnamese working not correctly

2๐Ÿ‘

โœ…

I have solved this problem. At first, I define a map that contain key value paired. Key is a character Vietnamese in UTF-8. Then I use this to convert some special character to relevant in English:

def vi_slug(data):
    vietnamese_map = {
        ord(u'o'): 'o', ord(u'รฒ'): 'o', ord(u'รณ'): 'o', ord(u'แป'): 'o', ord(u'รต'): 'o', ord(u'แป'): 'o',
        ord(u'ฦก'): 'o', ord(u'แป'): 'o', ord(u'แป›'): 'o', ord(u'แปŸ'): 'o', ord(u'แปก'): 'o', ord(u'แปฃ'): 'o',
        ord(u'รด'): 'o', ord(u'แป“'): 'o', ord(u'แป‘'): 'o', ord(u'แป•'): 'o', ord(u'แป—'): 'o', ord(u'แป™'): 'o',

        ord(u'ร '): 'a', ord(u'รก'): 'a', ord(u'รก'): 'a', ord(u'แบฃ'): 'a', ord(u'รฃ'): 'a', ord(u'แบก'): 'a',
        ord(u'ฤƒ'): 'a', ord(u'แบฏ'): 'a', ord(u'แบฑ'): 'a', ord(u'แบณ'): 'a', ord(u'แบต'): 'a', ord(u'แบก'): 'a',
        ord(u'รข'): 'a', ord(u'แบง'): 'a', ord(u'แบฅ'): 'a', ord(u'แบญ'): 'a', ord(u'แบซ'): 'a', ord(u'แบฉ'): 'a',

        ord(u'ฤ‘'): 'd', ord(u'ฤ'): 'd',

        ord(u'รจ'): 'e', ord(u'รฉ'): 'e', ord(u'แบป'): 'e', ord(u'แบฝ'): 'e', ord(u'แบน'): 'e',
        ord(u'รช'): 'e', ord(u'แป'): 'e', ord(u'แบฟ'): 'e', ord(u'แปƒ'): 'e', ord(u'แป…'): 'e', ord(u'แป‡'): 'e',

        ord(u'รฌ'): 'i', ord(u'รญ'): 'i', ord(u'แป‰'): 'i', ord(u'ฤฉ'): 'i', ord(u'แป‹'): 'i',
        ord(u'ฦฐ'): 'u', ord(u'แปซ'): 'u', ord(u'แปฉ'): 'u', ord(u'แปญ'): 'แปฏ', ord(u'แปฏ'): 'u', ord(u'แปฑ'): 'u',
        ord(u'รฝ'): 'y', ord(u'แปณ'): 'y', ord(u'แปท'): 'y', ord(u'แปน'): 'y', ord(u'แปต'): 'y',
    }
    slug = slugify(unicode(data).translate(vietnamese_map))
    return slug

Then you should override the save method for changing slug before it will be saved.
Note: the slug field has change to TextField.

    def save(self, *args, **kwargs):
        if not self.parent_category is None:
            try:
                parent_category = Category.objects.get(slug=self.parent_category)
                parent_category.numberChild += 1
                parent_category.save()

                if self.slug == "":
                    self.slug = vi_slug(self.name)
                else:
                    self.slug = vi_slug(self.slug)
            except:
                pass
        super(Category, self).save()

Hope this can help you less comsuming time for solving the same problem.

๐Ÿ‘คQuan Pham

Leave a comment