Джанго: слизняк на вьетнамском - PullRequest
4 голосов
/ 22 октября 2009

Сайт на вьетнамском, он практически не отличается от английского. Тем не менее, есть проблема, которая является слизняком. Когда я набираю такие символы, как «ư», «ơ», «á», ... Django не идентифицируется. Решение здесь состоит в том, чтобы заменить символы, которые не входят в. Например:

ư -> u 
ơ -> o 
á -> a 

Один из "những-viên-kẹo" станет "nhung-vien-keo". Однако я не знаю, как это сделать. Кто-нибудь Помогите мне. Большое спасибо!

Ответы [ 4 ]

7 голосов
/ 15 января 2010

[править]

Я забираю это обратно, django.template.defaultfilters.slugify() Джанго делает то, что вы хотите, используя unicodedata.normalize и .encode('ascii', 'ignore'). Просто подайте вашу строку в slugify:

from django.template.defaultfilters import slugify
print slugify(u"những-viên-kẹo")

Чтобы сделать это автоматически, добавьте это к методу .save() в ваших моделях:

from django.template.defaultfilters import slugify
MyModel(models.Model):
    title = models.CharField(max_length=255)
    slug  = models.SlugField(blank=True)

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        super(MyModel, self).save(*args, **kwargs)

Раствор, который я написал раньше (ниже), все еще будет полезен для языков, которые требуют дополнительных символов в своем переводе, например, немецкий язык ü-> ue, ß-> ss и т. Д.

[оригинальный пост]

Python позволяет использовать перевод для перевода символов в замещающую строку.

Простая версия для вашего случая будет:

vietnamese_map = {
    ord(u'ư'): 'u',
    ord(u'ơ'): 'o',
    ord(u'á'): 'a',
    ord(u'n'): 'n',
    ord(u'h'): 'h',
    ord(u'ữ'): 'u',
    ord(u'n'): 'n',
    ord(u'g'): 'g',
    ord(u'v'): 'v',
    ord(u'i'): 'i',
    ord(u'ê'): 'e',
    ord(u'n'): 'n',
    ord(u'k'): 'k',
    ord(u'ẹ'): 'e',
    ord(u'o'): 'o',
}

И тогда вы можете позвонить:

print u"những-viên-kẹo".translate(vietnamese_map)

Чтобы получить:

u"nhung-vien-keo"

Для более продвинутого использования (например, динамический дикт), смотрите, например, http://effbot.org/zone/unicode-convert.htm

Обратите внимание, что вышесказанное просто показывает, как должна выглядеть карта, это не очень удобный способ ввода данных. Более удобный способ сделать то же самое - что-то вроде:

_map = u"nn hh ữu nn gg vv ii êe nn kk ẹe oo"
# Take the above string and generate a translation dict
vietnamese_map = dict((ord(m[0]), m[1:]) for m in _map.split())
print u"những-viên-kẹo".translate(vietnamese_map)
1 голос
/ 06 февраля 2010

Вы можете попробовать нормализовать его Python ->

http://pyright.blogspot.com/2009/11/unicode-normalization-python-3x-unicode.html

это может помочь вместо того, чтобы перепечатывать вьетнамский алфавит из a ớ ờ bờ cờ dờ ore и игнорировать возможность других специальных латинских символов, просто запустить функцию нормализации и проверить, все ли работает хорошо, не забудьте проверить слово «đ "так как я столкнулся с проблемой, что функция нормализации не нормализовала Đ - D.

Удачи: P

1 голос
/ 15 января 2010

Вы должны написать новый фильтр или тег для этого.

0 голосов
/ 31 мая 2011

Или вы можете просто включить это приложение, чтобы сделать это для вас.

https://github.com/un33k/django-uslug

Это также гарантирует уникальность.

from uslug import uSlug
MyModel(models.Model):
    title = models.CharField(max_length=255)
    slug  = models.SlugField(blank=True)

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = uSlug(self.title)
        super(MyModel, self).save(*args, **kwargs)
...